Monstro.h 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. /*
  2. * Monstro.h - a semi-modular 3-osc synth with modulation matrix
  3. *
  4. * Copyright (c) 2014 Vesa Kivimäki <contact/dot/diizy/at/nbl/dot/fi>
  5. *
  6. * This file is part of LMMS - https://lmms.io
  7. *
  8. * This program is free software; you can redistribute it and/or
  9. * modify it under the terms of the GNU General Public
  10. * License as published by the Free Software Foundation; either
  11. * version 2 of the License, or (at your option) any later version.
  12. *
  13. * This program is distributed in the hope that it will be useful,
  14. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  16. * General Public License for more details.
  17. *
  18. * You should have received a copy of the GNU General Public
  19. * License along with this program (see COPYING); if not, write to the
  20. * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  21. * Boston, MA 02110-1301 USA.
  22. *
  23. */
  24. #ifndef MONSTRO_H
  25. #define MONSTRO_H
  26. #include <vector>
  27. #include "Instrument.h"
  28. #include "InstrumentView.h"
  29. #include "AutomatableModel.h"
  30. #include "AutomatableButton.h"
  31. #include "TempoSyncKnob.h"
  32. #include "NotePlayHandle.h"
  33. #include "PixmapButton.h"
  34. #include "ComboBox.h"
  35. #include "Oscillator.h"
  36. #include "lmms_math.h"
  37. #include "BandLimitedWave.h"
  38. //
  39. // UI Macros
  40. //
  41. #define makeknob( name, x, y, hint, unit, oname ) \
  42. name = new Knob( knobStyled, view ); \
  43. name ->move( x, y ); \
  44. name ->setHintText( hint, unit ); \
  45. name ->setObjectName( oname ); \
  46. name ->setFixedSize( 20, 20 );
  47. #define maketsknob( name, x, y, hint, unit, oname ) \
  48. name = new TempoSyncKnob( knobStyled, view ); \
  49. name ->move( x, y ); \
  50. name ->setHintText( hint, unit ); \
  51. name ->setObjectName( oname ); \
  52. name ->setFixedSize( 20, 20 );
  53. #define maketinyled( name, x, y, ttip ) \
  54. name = new PixmapButton( view, NULL ); \
  55. name -> setCheckable( true ); \
  56. name -> move( x, y ); \
  57. name -> setActiveGraphic( PLUGIN_NAME::getIconPixmap( "tinyled_on" ) ); \
  58. name -> setInactiveGraphic( PLUGIN_NAME::getIconPixmap( "tinyled_off" ) ); \
  59. ToolTip::add( name, ttip );
  60. // UI constants
  61. const int O1ROW = 22;
  62. const int O2ROW = 22 + 39;
  63. const int O3ROW = 22 + 39 * 2;
  64. const int LFOROW = 22 + 39 * 3;
  65. const int E1ROW = 22 + 39 * 4;
  66. const int E2ROW = 22 + 39 * 5;
  67. const int KNOBCOL1 = 16;
  68. const int KNOBCOL2 = 16 + 30;
  69. const int KNOBCOL3 = 16 + 30 * 2;
  70. const int KNOBCOL4 = 16 + 30 * 3;
  71. const int KNOBCOL5 = 16 + 30 * 4;
  72. const int KNOBCOL6 = 16 + 30 * 5;
  73. const int KNOBCOL7 = 16 + 30 * 6;
  74. const int LFOCOL1 = KNOBCOL2;
  75. const int LFOCOL2 = KNOBCOL2 + 26;
  76. const int LFOCOL3 = KNOBCOL2 + 26*2;
  77. const int LFOCOL4 = 171;
  78. const int LFOCOL5 = 171 + 26;
  79. const int LFOCOL6 = 171 + 26*2;
  80. const int MATCOL1 = 32;
  81. const int MATCOL2 = 32 + 25;
  82. const int MATCOL3 = 32 + 25*2;
  83. const int MATCOL4 = 32 + 25*3;
  84. const int MATCOL5 = 149;
  85. const int MATCOL6 = 149 + 25;
  86. const int MATCOL7 = 149 + 25*2;
  87. const int MATCOL8 = 149 + 25*3;
  88. const int MATROW1 = 22;
  89. const int MATROW2 = 22 + 39;
  90. const int MATROW3 = 22 + 39*2;
  91. const int MATROW4 = 22 + 39*3;
  92. const int MATROW5 = 22 + 39*4;
  93. const int MATROW6 = 22 + 39*5;
  94. const int OPVIEW = 0;
  95. const int MATVIEW = 1;
  96. // waveform enumerators
  97. const int WAVE_SINE = 0;
  98. const int WAVE_TRI = 1;
  99. const int WAVE_SAW = 2;
  100. const int WAVE_RAMP = 3;
  101. const int WAVE_SQR = 4;
  102. const int WAVE_MOOG = 5;
  103. const int WAVE_SQRSOFT = 6;
  104. const int WAVE_SINABS = 7;
  105. const int WAVE_EXP = 8;
  106. const int WAVE_NOISE = 9;
  107. const int WAVE_TRI_D = 10;
  108. const int WAVE_SAW_D = 11;
  109. const int WAVE_RAMP_D = 12;
  110. const int WAVE_SQR_D = 13;
  111. const int WAVE_MOOG_D = 14;
  112. const int NUM_WAVES = 15;
  113. // lfo-specific enumerators
  114. const int WAVE_RANDOM = 9;
  115. const int WAVE_RANDOM_SMOOTH = 10;
  116. const int NUM_LFO_WAVES = 11;
  117. // modulation enumerators
  118. const int MOD_MIX = 0;
  119. const int MOD_AM = 1;
  120. const int MOD_FM = 2;
  121. const int MOD_PM = 3;
  122. const int NUM_MODS = 4;
  123. const float MODCLIP = 2.0;
  124. const float MIN_FREQ = 18.0f;
  125. const float MAX_FREQ = 48000.0f;
  126. const float INTEGRATOR = 3.0f / 7.0f;
  127. const float FM_AMOUNT = 0.25f;
  128. const float PW_MIN = 0.25f;
  129. const float PW_MAX = 100.0f - PW_MIN;
  130. class MonstroInstrument;
  131. class MonstroView;
  132. class MonstroSynth
  133. {
  134. MM_OPERATORS
  135. public:
  136. MonstroSynth( MonstroInstrument * _i, NotePlayHandle * _nph );
  137. virtual ~MonstroSynth();
  138. void renderOutput( fpp_t _frames, sampleFrame * _buf );
  139. private:
  140. MonstroInstrument * m_parent;
  141. NotePlayHandle * m_nph;
  142. inline void updateModulators( float * env1, float * env2, float * lfo1, float * lfo2, int frames );
  143. // linear interpolation
  144. /* inline sample_t interpolate( sample_t s1, sample_t s2, float x )
  145. {
  146. return s1 + ( s2 - s1 ) * x;
  147. }*/ // using interpolation.h from now on
  148. inline sample_t calcSlope( int slope, sample_t s );
  149. // checks for lower bound for phase, upper bound is already checked by oscillator-functions in both
  150. // oscillator.h and bandlimitedwave.h so we save some cpu by only checking lower bound
  151. inline float lowBoundCheck( float ph )
  152. {
  153. return ph < 0.0f ? ph - ( static_cast<int>( ph ) - 1.0f ) : ph;
  154. }
  155. inline sample_t oscillate( int _wave, const float _ph, float _wavelen )
  156. {
  157. switch( _wave )
  158. {
  159. case WAVE_SINE:
  160. return Oscillator::sinSample( _ph );
  161. break;
  162. case WAVE_TRI:
  163. //return Oscillator::triangleSample( _ph );
  164. return BandLimitedWave::oscillate( _ph, _wavelen, BandLimitedWave::BLTriangle );
  165. break;
  166. case WAVE_SAW:
  167. //return Oscillator::sawSample( _ph );
  168. return BandLimitedWave::oscillate( _ph, _wavelen, BandLimitedWave::BLSaw );
  169. break;
  170. case WAVE_RAMP:
  171. //return Oscillator::sawSample( _ph ) * -1.0;
  172. return BandLimitedWave::oscillate( _ph, _wavelen, BandLimitedWave::BLSaw ) * -1.0;
  173. break;
  174. case WAVE_SQR:
  175. //return Oscillator::squareSample( _ph );
  176. return BandLimitedWave::oscillate( _ph, _wavelen, BandLimitedWave::BLSquare );
  177. break;
  178. case WAVE_SQRSOFT:
  179. {
  180. const float ph = fraction( _ph );
  181. if( ph < 0.1 ) return Oscillator::sinSample( ph * 5 + 0.75 );
  182. else if( ph < 0.5 ) return 1.0f;
  183. else if( ph < 0.6 ) return Oscillator::sinSample( ph * 5 + 0.75 );
  184. else return -1.0f;
  185. break;
  186. }
  187. case WAVE_MOOG:
  188. //return Oscillator::moogSawSample( _ph );
  189. return BandLimitedWave::oscillate( _ph, _wavelen, BandLimitedWave::BLMoog );
  190. break;
  191. case WAVE_SINABS:
  192. return qAbs( Oscillator::sinSample( _ph ) );
  193. break;
  194. case WAVE_EXP:
  195. return Oscillator::expSample( _ph );
  196. break;
  197. case WAVE_NOISE:
  198. return Oscillator::noiseSample( _ph );
  199. break;
  200. case WAVE_TRI_D:
  201. return Oscillator::triangleSample( _ph );
  202. break;
  203. case WAVE_SAW_D:
  204. return Oscillator::sawSample( _ph );
  205. break;
  206. case WAVE_RAMP_D:
  207. return Oscillator::sawSample( _ph ) * -1.0;
  208. break;
  209. case WAVE_SQR_D:
  210. return Oscillator::squareSample( _ph );
  211. break;
  212. case WAVE_MOOG_D:
  213. return Oscillator::moogSawSample( _ph );
  214. break;
  215. }
  216. return 0.0;
  217. }
  218. float m_osc1l_phase;
  219. float m_osc1r_phase;
  220. float m_osc2l_phase;
  221. float m_osc2r_phase;
  222. float m_osc3l_phase;
  223. float m_osc3r_phase;
  224. sample_t m_env_phase [2];
  225. float m_lfo_phase [2];
  226. sample_t m_lfo_last [2];
  227. sample_t m_lfo_next [2];
  228. float m_lfo_inc [2];
  229. float m_lfo_rate [2];
  230. float m_env_sus [2];
  231. int m_lfovalue[2];
  232. int m_lfoatt[2];
  233. float m_env_pre[2];
  234. float m_env_att[2];
  235. float m_env_hold[2];
  236. float m_env_dec[2];
  237. float m_env_rel[2];
  238. sample_t m_osc1l_last;
  239. sample_t m_osc1r_last;
  240. sample_t m_l_last;
  241. sample_t m_r_last;
  242. float m_ph2l_last;
  243. float m_ph2r_last;
  244. float m_ph3l_last;
  245. float m_ph3r_last;
  246. bool m_invert2l;
  247. bool m_invert3l;
  248. bool m_invert2r;
  249. bool m_invert3r;
  250. int m_counter2l;
  251. int m_counter2r;
  252. int m_counter3l;
  253. int m_counter3r;
  254. std::vector<float> m_lfo[2];
  255. std::vector<float> m_env[2];
  256. };
  257. class MonstroInstrument : public Instrument
  258. {
  259. Q_OBJECT
  260. #define setwavemodel( name ) \
  261. name .addItem( tr( "Sine wave" ), std::make_unique<PluginPixmapLoader>( "sin" ) ); \
  262. name .addItem( tr( "Bandlimited Triangle wave" ), std::make_unique<PluginPixmapLoader>( "tri" ) ); \
  263. name .addItem( tr( "Bandlimited Saw wave" ), std::make_unique<PluginPixmapLoader>( "saw" ) ); \
  264. name .addItem( tr( "Bandlimited Ramp wave" ), std::make_unique<PluginPixmapLoader>( "ramp" ) ); \
  265. name .addItem( tr( "Bandlimited Square wave" ), std::make_unique<PluginPixmapLoader>( "sqr" ) ); \
  266. name .addItem( tr( "Bandlimited Moog saw wave" ), std::make_unique<PluginPixmapLoader>( "moog" ) ); \
  267. name .addItem( tr( "Soft square wave" ), std::make_unique<PluginPixmapLoader>( "sqrsoft" ) ); \
  268. name .addItem( tr( "Absolute sine wave" ), std::make_unique<PluginPixmapLoader>( "sinabs" ) ); \
  269. name .addItem( tr( "Exponential wave" ), std::make_unique<PluginPixmapLoader>( "exp" ) ); \
  270. name .addItem( tr( "White noise" ), std::make_unique<PluginPixmapLoader>( "noise" ) ); \
  271. name .addItem( tr( "Digital Triangle wave" ), std::make_unique<PluginPixmapLoader>( "tri" ) ); \
  272. name .addItem( tr( "Digital Saw wave" ), std::make_unique<PluginPixmapLoader>( "saw" ) ); \
  273. name .addItem( tr( "Digital Ramp wave" ), std::make_unique<PluginPixmapLoader>( "ramp" ) ); \
  274. name .addItem( tr( "Digital Square wave" ), std::make_unique<PluginPixmapLoader>( "sqr" ) ); \
  275. name .addItem( tr( "Digital Moog saw wave" ), std::make_unique<PluginPixmapLoader>( "moog" ) );
  276. #define setlfowavemodel( name ) \
  277. name .addItem( tr( "Sine wave" ), std::make_unique<PluginPixmapLoader>( "sin" ) ); \
  278. name .addItem( tr( "Triangle wave" ), std::make_unique<PluginPixmapLoader>( "tri" ) ); \
  279. name .addItem( tr( "Saw wave" ), std::make_unique<PluginPixmapLoader>( "saw" ) ); \
  280. name .addItem( tr( "Ramp wave" ), std::make_unique<PluginPixmapLoader>( "ramp" ) ); \
  281. name .addItem( tr( "Square wave" ), std::make_unique<PluginPixmapLoader>( "sqr" ) ); \
  282. name .addItem( tr( "Moog saw wave" ), std::make_unique<PluginPixmapLoader>( "moog" ) ); \
  283. name .addItem( tr( "Soft square wave" ), std::make_unique<PluginPixmapLoader>( "sqrsoft" ) ); \
  284. name .addItem( tr( "Abs. sine wave" ), std::make_unique<PluginPixmapLoader>( "sinabs" ) ); \
  285. name .addItem( tr( "Exponential wave" ), std::make_unique<PluginPixmapLoader>( "exp" ) ); \
  286. name .addItem( tr( "Random" ), std::make_unique<PluginPixmapLoader>( "rand" ) ); \
  287. name .addItem( tr( "Random smooth" ), std::make_unique<PluginPixmapLoader>( "rand" ) );
  288. public:
  289. MonstroInstrument( InstrumentTrack * _instrument_track );
  290. virtual ~MonstroInstrument();
  291. virtual void playNote( NotePlayHandle * _n,
  292. sampleFrame * _working_buffer );
  293. virtual void deleteNotePluginData( NotePlayHandle * _n );
  294. virtual void saveSettings( QDomDocument & _doc,
  295. QDomElement & _this );
  296. virtual void loadSettings( const QDomElement & _this );
  297. virtual QString nodeName() const;
  298. virtual f_cnt_t desiredReleaseFrames() const;
  299. virtual PluginView * instantiateView( QWidget * _parent );
  300. public slots:
  301. void updateVolume1();
  302. void updateVolume2();
  303. void updateVolume3();
  304. void updateFreq1();
  305. void updateFreq2();
  306. void updateFreq3();
  307. void updatePO1();
  308. void updatePO2();
  309. void updatePO3();
  310. void updateEnvelope1();
  311. void updateEnvelope2();
  312. void updateLFOAtts();
  313. void updateSamplerate();
  314. void updateSlope1();
  315. void updateSlope2();
  316. protected:
  317. float m_osc1l_vol;
  318. float m_osc1r_vol;
  319. float m_osc2l_vol;
  320. float m_osc2r_vol;
  321. float m_osc3l_vol;
  322. float m_osc3r_vol;
  323. float m_osc1l_freq;
  324. float m_osc1r_freq;
  325. float m_osc2l_freq;
  326. float m_osc2r_freq;
  327. float m_osc3_freq;
  328. float m_osc1l_po;
  329. float m_osc1r_po;
  330. float m_osc2l_po;
  331. float m_osc2r_po;
  332. float m_osc3l_po;
  333. float m_osc3r_po;
  334. float m_env1_pre;
  335. float m_env1_att;
  336. float m_env1_hold;
  337. float m_env1_dec;
  338. float m_env1_rel;
  339. float m_env2_pre;
  340. float m_env2_att;
  341. float m_env2_hold;
  342. float m_env2_dec;
  343. float m_env2_rel;
  344. f_cnt_t m_env1_len;
  345. f_cnt_t m_env2_len;
  346. f_cnt_t m_env1_relF;
  347. f_cnt_t m_env2_relF;
  348. float m_slope [2];
  349. f_cnt_t m_lfo1_att;
  350. f_cnt_t m_lfo2_att;
  351. sample_rate_t m_samplerate;
  352. fpp_t m_fpp;
  353. float m_integrator;
  354. float m_fmCorrection;
  355. int m_counterMax;
  356. private:
  357. inline float leftCh( float _vol, float _pan )
  358. {
  359. return ( _pan <= 0 ? 1.0 : 1.0 - ( _pan / 100.0 ) ) * _vol / 100.0;
  360. }
  361. inline float rightCh( float _vol, float _pan )
  362. {
  363. return ( _pan >= 0 ? 1.0 : 1.0 + ( _pan / 100.0 ) ) * _vol / 100.0;
  364. }
  365. //////////////////////////////////////
  366. // models of //
  367. // operator view knobs //
  368. // //
  369. //////////////////////////////////////
  370. FloatModel m_osc1Vol;
  371. FloatModel m_osc1Pan;
  372. FloatModel m_osc1Crs;
  373. FloatModel m_osc1Ftl;
  374. FloatModel m_osc1Ftr;
  375. FloatModel m_osc1Spo;
  376. FloatModel m_osc1Pw;
  377. BoolModel m_osc1SSR;
  378. BoolModel m_osc1SSF;
  379. FloatModel m_osc2Vol;
  380. FloatModel m_osc2Pan;
  381. FloatModel m_osc2Crs;
  382. FloatModel m_osc2Ftl;
  383. FloatModel m_osc2Ftr;
  384. FloatModel m_osc2Spo;
  385. ComboBoxModel m_osc2Wave;
  386. BoolModel m_osc2SyncH;
  387. BoolModel m_osc2SyncR;
  388. FloatModel m_osc3Vol;
  389. FloatModel m_osc3Pan;
  390. FloatModel m_osc3Crs;
  391. FloatModel m_osc3Spo;
  392. FloatModel m_osc3Sub;
  393. ComboBoxModel m_osc3Wave1;
  394. ComboBoxModel m_osc3Wave2;
  395. BoolModel m_osc3SyncH;
  396. BoolModel m_osc3SyncR;
  397. ComboBoxModel m_lfo1Wave;
  398. TempoSyncKnobModel m_lfo1Att;
  399. TempoSyncKnobModel m_lfo1Rate;
  400. FloatModel m_lfo1Phs;
  401. ComboBoxModel m_lfo2Wave;
  402. TempoSyncKnobModel m_lfo2Att;
  403. TempoSyncKnobModel m_lfo2Rate;
  404. FloatModel m_lfo2Phs;
  405. TempoSyncKnobModel m_env1Pre;
  406. TempoSyncKnobModel m_env1Att;
  407. TempoSyncKnobModel m_env1Hold;
  408. TempoSyncKnobModel m_env1Dec;
  409. FloatModel m_env1Sus;
  410. TempoSyncKnobModel m_env1Rel;
  411. FloatModel m_env1Slope;
  412. TempoSyncKnobModel m_env2Pre;
  413. TempoSyncKnobModel m_env2Att;
  414. TempoSyncKnobModel m_env2Hold;
  415. TempoSyncKnobModel m_env2Dec;
  416. FloatModel m_env2Sus;
  417. TempoSyncKnobModel m_env2Rel;
  418. FloatModel m_env2Slope;
  419. IntModel m_o23Mod;
  420. IntModel m_selectedView;
  421. //////////////////////////////////////
  422. // models of //
  423. // modulation matrix view knobs //
  424. // //
  425. //////////////////////////////////////
  426. FloatModel m_vol1env1;
  427. FloatModel m_vol1env2;
  428. FloatModel m_vol1lfo1;
  429. FloatModel m_vol1lfo2;
  430. FloatModel m_vol2env1;
  431. FloatModel m_vol2env2;
  432. FloatModel m_vol2lfo1;
  433. FloatModel m_vol2lfo2;
  434. FloatModel m_vol3env1;
  435. FloatModel m_vol3env2;
  436. FloatModel m_vol3lfo1;
  437. FloatModel m_vol3lfo2;
  438. FloatModel m_phs1env1;
  439. FloatModel m_phs1env2;
  440. FloatModel m_phs1lfo1;
  441. FloatModel m_phs1lfo2;
  442. FloatModel m_phs2env1;
  443. FloatModel m_phs2env2;
  444. FloatModel m_phs2lfo1;
  445. FloatModel m_phs2lfo2;
  446. FloatModel m_phs3env1;
  447. FloatModel m_phs3env2;
  448. FloatModel m_phs3lfo1;
  449. FloatModel m_phs3lfo2;
  450. FloatModel m_pit1env1;
  451. FloatModel m_pit1env2;
  452. FloatModel m_pit1lfo1;
  453. FloatModel m_pit1lfo2;
  454. FloatModel m_pit2env1;
  455. FloatModel m_pit2env2;
  456. FloatModel m_pit2lfo1;
  457. FloatModel m_pit2lfo2;
  458. FloatModel m_pit3env1;
  459. FloatModel m_pit3env2;
  460. FloatModel m_pit3lfo1;
  461. FloatModel m_pit3lfo2;
  462. FloatModel m_pw1env1;
  463. FloatModel m_pw1env2;
  464. FloatModel m_pw1lfo1;
  465. FloatModel m_pw1lfo2;
  466. FloatModel m_sub3env1;
  467. FloatModel m_sub3env2;
  468. FloatModel m_sub3lfo1;
  469. FloatModel m_sub3lfo2;
  470. friend class MonstroSynth;
  471. friend class MonstroView;
  472. };
  473. class MonstroView : public InstrumentViewFixedSize
  474. {
  475. Q_OBJECT
  476. public:
  477. MonstroView( Instrument * _instrument,
  478. QWidget * _parent );
  479. virtual ~MonstroView();
  480. protected slots:
  481. void updateLayout();
  482. private:
  483. virtual void modelChanged();
  484. void setWidgetBackground( QWidget * _widget, const QString & _pic );
  485. QWidget * setupOperatorsView( QWidget * _parent );
  486. QWidget * setupMatrixView( QWidget * _parent );
  487. //////////////////////////////////////
  488. // //
  489. // operator view knobs //
  490. // //
  491. //////////////////////////////////////
  492. Knob * m_osc1VolKnob;
  493. Knob * m_osc1PanKnob;
  494. Knob * m_osc1CrsKnob;
  495. Knob * m_osc1FtlKnob;
  496. Knob * m_osc1FtrKnob;
  497. Knob * m_osc1SpoKnob;
  498. Knob * m_osc1PwKnob;
  499. PixmapButton * m_osc1SSRButton;
  500. PixmapButton * m_osc1SSFButton;
  501. Knob * m_osc2VolKnob;
  502. Knob * m_osc2PanKnob;
  503. Knob * m_osc2CrsKnob;
  504. Knob * m_osc2FtlKnob;
  505. Knob * m_osc2FtrKnob;
  506. Knob * m_osc2SpoKnob;
  507. ComboBox * m_osc2WaveBox;
  508. PixmapButton * m_osc2SyncHButton;
  509. PixmapButton * m_osc2SyncRButton;
  510. Knob * m_osc3VolKnob;
  511. Knob * m_osc3PanKnob;
  512. Knob * m_osc3CrsKnob;
  513. Knob * m_osc3SpoKnob;
  514. Knob * m_osc3SubKnob;
  515. ComboBox * m_osc3Wave1Box;
  516. ComboBox * m_osc3Wave2Box;
  517. PixmapButton * m_osc3SyncHButton;
  518. PixmapButton * m_osc3SyncRButton;
  519. ComboBox * m_lfo1WaveBox;
  520. TempoSyncKnob * m_lfo1AttKnob;
  521. TempoSyncKnob * m_lfo1RateKnob;
  522. Knob * m_lfo1PhsKnob;
  523. ComboBox * m_lfo2WaveBox;
  524. TempoSyncKnob * m_lfo2AttKnob;
  525. TempoSyncKnob * m_lfo2RateKnob;
  526. Knob * m_lfo2PhsKnob;
  527. TempoSyncKnob * m_env1PreKnob;
  528. TempoSyncKnob * m_env1AttKnob;
  529. TempoSyncKnob * m_env1HoldKnob;
  530. TempoSyncKnob * m_env1DecKnob;
  531. Knob * m_env1SusKnob;
  532. TempoSyncKnob * m_env1RelKnob;
  533. Knob * m_env1SlopeKnob;
  534. TempoSyncKnob * m_env2PreKnob;
  535. TempoSyncKnob * m_env2AttKnob;
  536. TempoSyncKnob * m_env2HoldKnob;
  537. TempoSyncKnob * m_env2DecKnob;
  538. Knob * m_env2SusKnob;
  539. TempoSyncKnob * m_env2RelKnob;
  540. Knob * m_env2SlopeKnob;
  541. automatableButtonGroup * m_o23ModGroup;
  542. automatableButtonGroup * m_selectedViewGroup;
  543. QWidget * m_operatorsView;
  544. QWidget * m_matrixView;
  545. /////////////////////////////////
  546. // //
  547. // matrix view knobs //
  548. // //
  549. /////////////////////////////////
  550. Knob * m_vol1env1Knob;
  551. Knob * m_vol1env2Knob;
  552. Knob * m_vol1lfo1Knob;
  553. Knob * m_vol1lfo2Knob;
  554. Knob * m_vol2env1Knob;
  555. Knob * m_vol2env2Knob;
  556. Knob * m_vol2lfo1Knob;
  557. Knob * m_vol2lfo2Knob;
  558. Knob * m_vol3env1Knob;
  559. Knob * m_vol3env2Knob;
  560. Knob * m_vol3lfo1Knob;
  561. Knob * m_vol3lfo2Knob;
  562. Knob * m_phs1env1Knob;
  563. Knob * m_phs1env2Knob;
  564. Knob * m_phs1lfo1Knob;
  565. Knob * m_phs1lfo2Knob;
  566. Knob * m_phs2env1Knob;
  567. Knob * m_phs2env2Knob;
  568. Knob * m_phs2lfo1Knob;
  569. Knob * m_phs2lfo2Knob;
  570. Knob * m_phs3env1Knob;
  571. Knob * m_phs3env2Knob;
  572. Knob * m_phs3lfo1Knob;
  573. Knob * m_phs3lfo2Knob;
  574. Knob * m_pit1env1Knob;
  575. Knob * m_pit1env2Knob;
  576. Knob * m_pit1lfo1Knob;
  577. Knob * m_pit1lfo2Knob;
  578. Knob * m_pit2env1Knob;
  579. Knob * m_pit2env2Knob;
  580. Knob * m_pit2lfo1Knob;
  581. Knob * m_pit2lfo2Knob;
  582. Knob * m_pit3env1Knob;
  583. Knob * m_pit3env2Knob;
  584. Knob * m_pit3lfo1Knob;
  585. Knob * m_pit3lfo2Knob;
  586. Knob * m_pw1env1Knob;
  587. Knob * m_pw1env2Knob;
  588. Knob * m_pw1lfo1Knob;
  589. Knob * m_pw1lfo2Knob;
  590. Knob * m_sub3env1Knob;
  591. Knob * m_sub3env2Knob;
  592. Knob * m_sub3lfo1Knob;
  593. Knob * m_sub3lfo2Knob;
  594. };
  595. #endif