You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

957 lines
25KB

  1. // Copyright 2013 Olivier Gillet.
  2. //
  3. // Author: Olivier Gillet (ol.gillet@gmail.com)
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. // See http://creativecommons.org/licenses/MIT/ for more information.
  24. //
  25. // -----------------------------------------------------------------------------
  26. //
  27. // Parameter definitions.
  28. #include "yarns/settings.h"
  29. #include <algorithm>
  30. #include <cstring>
  31. namespace yarns {
  32. const char* const layout_values[] = {
  33. "1M", "2M", "4M", "2P", "4P", "2>", "4>", "8>", "4T", "4V", "3+1"
  34. };
  35. const char* const clock_division_values[] = {
  36. "/1", "/2", "/3", "/4", "/6", "/8", "12", "16", "24", "32", "48", "96"
  37. };
  38. const char* const midi_out_mode_values[] = {
  39. "OFF", "THRU", "ARP/SEQ"
  40. };
  41. const char* const boolean_values[] = {
  42. "OFF", "ON"
  43. };
  44. const char* const voicing_allocation_mode_values[] = {
  45. "MONO", "POLY", "CYCLIC", "RANDOM", "VELO", "SORTED", "U1 UNISON",
  46. "U2 UNISON 2"
  47. };
  48. const char* const sequencer_arp_direction_values[] = {
  49. "UP", "DN", "UD", "RANDOM", "PLAYED", "CHORD"
  50. };
  51. const char* const voicing_aux_cv_values[] = {
  52. "VELOCITY", "MODULATION", "AT", "BREATH", "PEDAL", "BEND", "VIBRATO LFO", "LFO"
  53. };
  54. const char* const voicing_oscillator_values[] = {
  55. "OF", "\x88\x88", "\x8C\x8C", "\x8C_", "/\\", "SINE", "**"
  56. };
  57. const char* const voicing_allocation_priority_values[] = {
  58. "LAST", "LOW", "HIGH"
  59. };
  60. const char* const trigger_shape_values[] = {
  61. "SQ", "LINEAR", "EXPO", "RING", "STEP", "BURST"
  62. };
  63. const char* const note_values[] = {
  64. "C ", "Db", "D", "Eb", "E ", "F ", "Gb", "G ", "Ab", "A ", "Bb", "B "
  65. };
  66. const char* const tuning_system_values[] = {
  67. "EQUAL TEMPERAMENT",
  68. "JUST INTONATION",
  69. "PYTHAGOREAN",
  70. "EB 1/4",
  71. "E 1/4",
  72. "EA 1/4",
  73. "01 BHAIRAV",
  74. "02 GUNAKRI",
  75. "03 MARWA",
  76. "04 SHREE",
  77. "05 PURVI",
  78. "06 BILAWAL",
  79. "07 YAMAN",
  80. "08 KAFI",
  81. "09 BHIMPALASREE",
  82. "10 DARBARI",
  83. "11 BAGESHREE",
  84. "12 RAGESHREE",
  85. "13 KHAMAJ",
  86. "14 MI MAL",
  87. "15 PARAMESHWARI",
  88. "16 RANGESHWARI",
  89. "17 GANGESHWARI",
  90. "18 KAMESHWARI",
  91. "19 PA KAFI",
  92. "20 NATBHAIRAV",
  93. "21 M.KAUNS",
  94. "22 BAIRAGI",
  95. "23 B.TODI",
  96. "24 CHANDRADEEP",
  97. "25 KAUSHIK TODI",
  98. "26 JOGESHWARI",
  99. "27 RASIA",
  100. "CUSTOM"
  101. };
  102. /* static */
  103. const Setting Settings::settings_[] = {
  104. {
  105. "LA", "LAYOUT",
  106. SETTING_DOMAIN_MULTI, { MULTI_LAYOUT, 0 },
  107. SETTING_UNIT_ENUMERATION, LAYOUT_MONO, LAYOUT_LAST - 1, layout_values,
  108. 0, 1,
  109. },
  110. {
  111. "PA", "PART",
  112. SETTING_DOMAIN_GLOBAL, { GLOBAL_ACTIVE_PART, 0 },
  113. SETTING_UNIT_INDEX, 0, 3, NULL,
  114. 0, 0,
  115. },
  116. {
  117. "PA", "PART",
  118. SETTING_DOMAIN_GLOBAL, { GLOBAL_ACTIVE_PART, 0 },
  119. SETTING_UNIT_INDEX, 0, 1, NULL,
  120. 0, 0,
  121. },
  122. {
  123. "TE", "TEMPO",
  124. SETTING_DOMAIN_MULTI, { MULTI_CLOCK_TEMPO, 0 },
  125. SETTING_UNIT_TEMPO, 39, 240, NULL,
  126. 0, 2,
  127. },
  128. {
  129. "SW", "SWING",
  130. SETTING_DOMAIN_MULTI, { MULTI_CLOCK_SWING, 0 },
  131. SETTING_UNIT_UINT8, 0, 99, NULL,
  132. 0, 3,
  133. },
  134. {
  135. "I/", "INPUT CLK DIV",
  136. SETTING_DOMAIN_MULTI, { MULTI_CLOCK_INPUT_DIVISION, 0 },
  137. SETTING_UNIT_UINT8, 1, 4, NULL,
  138. 0, 0,
  139. },
  140. {
  141. "O/", "OUTPUT CLK DIV",
  142. SETTING_DOMAIN_MULTI, { MULTI_CLOCK_OUTPUT_DIVISION, 0 },
  143. SETTING_UNIT_ENUMERATION, 0, 11, clock_division_values,
  144. 0, 0,
  145. },
  146. {
  147. "B-", "BAR DURATION",
  148. SETTING_DOMAIN_MULTI, { MULTI_CLOCK_BAR_DURATION, 0 },
  149. SETTING_UNIT_BAR_DURATION, 0, kMaxBarDuration + 1, NULL,
  150. 0, 0,
  151. },
  152. {
  153. "C>", "CLOCK OUTPUT",
  154. SETTING_DOMAIN_MULTI, { MULTI_CLOCK_OVERRIDE, 0 },
  155. SETTING_UNIT_ENUMERATION, 0, 1, boolean_values,
  156. 0, 0,
  157. },
  158. {
  159. "CH", "CHANNEL",
  160. SETTING_DOMAIN_PART, { PART_MIDI_CHANNEL, 0 },
  161. SETTING_UNIT_MIDI_CHANNEL, 0, 16, NULL,
  162. 0, 4,
  163. },
  164. {
  165. "N>", "NOTE>",
  166. SETTING_DOMAIN_PART, { PART_MIDI_MIN_NOTE, 0 },
  167. SETTING_UNIT_UINT8, 0, 127, NULL,
  168. 16, 5,
  169. },
  170. {
  171. "N<", "NOTE<",
  172. SETTING_DOMAIN_PART, { PART_MIDI_MAX_NOTE, 0 },
  173. SETTING_UNIT_UINT8, 0, 127, NULL,
  174. 17, 6,
  175. },
  176. {
  177. "NO", "NOTE",
  178. SETTING_DOMAIN_PART, { PART_MIDI_MIN_NOTE, PART_MIDI_MAX_NOTE },
  179. SETTING_UNIT_UINT8, 0, 127, NULL,
  180. 0, 0,
  181. },
  182. {
  183. "V<", "VELO<",
  184. SETTING_DOMAIN_PART, { PART_MIDI_MIN_VELOCITY, 0 },
  185. SETTING_UNIT_UINT8, 0, 127, NULL,
  186. 0, 0,
  187. },
  188. {
  189. "V>", "VELO>",
  190. SETTING_DOMAIN_PART, { PART_MIDI_MAX_VELOCITY, 0 },
  191. SETTING_UNIT_UINT8, 0, 127, NULL,
  192. 0, 0,
  193. },
  194. {
  195. ">>", "OUTPUT MIDI MODE",
  196. SETTING_DOMAIN_PART, { PART_MIDI_OUT_MODE, 0 },
  197. SETTING_UNIT_ENUMERATION, 0, 2, midi_out_mode_values,
  198. 0, 7,
  199. },
  200. {
  201. "VO", "VOICING",
  202. SETTING_DOMAIN_PART, { PART_VOICING_ALLOCATION_MODE, 0 },
  203. SETTING_UNIT_ENUMERATION, 1, VOICE_ALLOCATION_MODE_LAST - 1,
  204. voicing_allocation_mode_values,
  205. 18, 8,
  206. },
  207. {
  208. "NP", "NOTE PRIORITY",
  209. SETTING_DOMAIN_PART, { PART_VOICING_ALLOCATION_PRIORITY, 0 },
  210. SETTING_UNIT_ENUMERATION, 0, 2, voicing_allocation_priority_values,
  211. 19, 9,
  212. },
  213. {
  214. "PO", "PORTAMENTO",
  215. SETTING_DOMAIN_PART, { PART_VOICING_PORTAMENTO, 0 },
  216. SETTING_UNIT_PORTAMENTO, 0, 101, NULL,
  217. 5, 10,
  218. },
  219. {
  220. "LG", "LEGATO MODE",
  221. SETTING_DOMAIN_PART, { PART_VOICING_LEGATO_MODE, 0 },
  222. SETTING_UNIT_ENUMERATION, 0, 1, boolean_values,
  223. 20, 11,
  224. },
  225. {
  226. "BR", "BEND RANGE",
  227. SETTING_DOMAIN_PART, { PART_VOICING_PITCH_BEND_RANGE, 0 },
  228. SETTING_UNIT_UINT8, 0, 24, NULL,
  229. 21, 12,
  230. },
  231. {
  232. "VR", "VIBRATO RANGE",
  233. SETTING_DOMAIN_PART, { PART_VOICING_VIBRATO_RANGE, 0 },
  234. SETTING_UNIT_UINT8, 0, 12, NULL,
  235. 22, 13,
  236. },
  237. {
  238. "VS", "VIBRATO SPEED",
  239. SETTING_DOMAIN_PART, { PART_VOICING_MODULATION_RATE, 0 },
  240. SETTING_UNIT_VIBRATO_SPEED, 0, 109, NULL,
  241. 23, 14,
  242. },
  243. {
  244. "TT", "TRANSPOSE",
  245. SETTING_DOMAIN_PART, { PART_VOICING_TUNING_TRANSPOSE, 0 },
  246. SETTING_UNIT_INT8, -36, 36, NULL,
  247. 24, 15,
  248. },
  249. {
  250. "TF", "FINE TUNING",
  251. SETTING_DOMAIN_PART, { PART_VOICING_TUNING_FINE, 0 },
  252. SETTING_UNIT_INT8, -64, 64, NULL,
  253. 25, 16,
  254. },
  255. {
  256. "TR", "TUNING ROOT",
  257. SETTING_DOMAIN_PART, { PART_VOICING_TUNING_ROOT, 0 },
  258. SETTING_UNIT_ENUMERATION, 0, 11, note_values,
  259. 26, 17,
  260. },
  261. {
  262. "TS", "TUNING SYSTEM",
  263. SETTING_DOMAIN_PART, { PART_VOICING_TUNING_SYSTEM, 0 },
  264. SETTING_UNIT_ENUMERATION, 0, TUNING_SYSTEM_LAST - 1,
  265. tuning_system_values,
  266. 27, 18,
  267. },
  268. {
  269. "T-", "TRIG DURATION",
  270. SETTING_DOMAIN_PART, { PART_VOICING_TRIGGER_DURATION, 0 },
  271. SETTING_UNIT_UINT8, 1, 99, NULL,
  272. 28, 19,
  273. },
  274. {
  275. "T*", "TRIG VELOCITY SCALE",
  276. SETTING_DOMAIN_PART, { PART_VOICING_TRIGGER_SCALE, 0 },
  277. SETTING_UNIT_ENUMERATION, 0, 1, boolean_values,
  278. 29, 20,
  279. },
  280. {
  281. "T\x88", "TRIG SHAPE",
  282. SETTING_DOMAIN_PART, { PART_VOICING_TRIGGER_SHAPE, 0 },
  283. SETTING_UNIT_ENUMERATION, 0, 5, trigger_shape_values,
  284. 30, 21,
  285. },
  286. {
  287. "CV", "CV OUT",
  288. SETTING_DOMAIN_PART, { PART_VOICING_AUX_CV, 0 },
  289. SETTING_UNIT_ENUMERATION, 0, 7, voicing_aux_cv_values,
  290. 31, 22,
  291. },
  292. {
  293. "3>", "CV OUT 3",
  294. SETTING_DOMAIN_PART, { PART_VOICING_AUX_CV, 0 },
  295. SETTING_UNIT_ENUMERATION, 0, 7, voicing_aux_cv_values,
  296. 31, 22,
  297. },
  298. {
  299. "4>", "CV OUT 4",
  300. SETTING_DOMAIN_PART, { PART_VOICING_AUX_CV_2, 0 },
  301. SETTING_UNIT_ENUMERATION, 0, 7, voicing_aux_cv_values,
  302. 72, 0,
  303. },
  304. {
  305. "OS", "OSCILLATOR",
  306. SETTING_DOMAIN_PART, { PART_VOICING_AUDIO_MODE, 0 },
  307. SETTING_UNIT_ENUMERATION, 0, 6, voicing_oscillator_values,
  308. 71, 23,
  309. },
  310. {
  311. "C/", "CLOCK DIV",
  312. SETTING_DOMAIN_PART, { PART_SEQUENCER_CLOCK_DIVISION, 0 },
  313. SETTING_UNIT_ENUMERATION, 0, 11, clock_division_values,
  314. 102, 24,
  315. },
  316. {
  317. "G-", "GATE LENGTH",
  318. SETTING_DOMAIN_PART, { PART_SEQUENCER_GATE_LENGTH, 0 },
  319. SETTING_UNIT_UINT8, 1, 48, NULL,
  320. 103, 25,
  321. },
  322. {
  323. "AR", "ARP RANGE",
  324. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_RANGE, 0 },
  325. SETTING_UNIT_UINT8, 0, 4, NULL,
  326. 104, 26,
  327. },
  328. {
  329. "RG", "RHYTHMIC GENERATOR",
  330. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_RANGE, 0 },
  331. SETTING_UNIT_ENUMERATION, 0, 1, boolean_values,
  332. 0, 0,
  333. },
  334. {
  335. "AD", "ARP DIRECTION",
  336. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_DIRECTION, 0 },
  337. SETTING_UNIT_ENUMERATION, 0, ARPEGGIATOR_DIRECTION_LAST - 1,
  338. sequencer_arp_direction_values,
  339. 0, 0,
  340. },
  341. {
  342. // Variant without the CHORD option.
  343. "AD", "ARP DIRECTION",
  344. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_DIRECTION, 0 },
  345. SETTING_UNIT_ENUMERATION, 0, ARPEGGIATOR_DIRECTION_LAST - 2,
  346. sequencer_arp_direction_values,
  347. 105, 27,
  348. },
  349. {
  350. "AP", "ARP PATTERN",
  351. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_PATTERN, 0 },
  352. SETTING_UNIT_INDEX, 0, 21, NULL,
  353. 106, 28,
  354. },
  355. {
  356. "RP", "RHYTHMIC PATTERN",
  357. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_PATTERN, 0 },
  358. SETTING_UNIT_INDEX, 0, 21, NULL,
  359. 0, 0,
  360. },
  361. {
  362. "E-", "EUCLIDEAN LENGTH",
  363. SETTING_DOMAIN_PART, { PART_SEQUENCER_EUCLIDEAN_LENGTH, 0 },
  364. SETTING_UNIT_UINT8, 0, 32, NULL,
  365. 107, 29,
  366. },
  367. {
  368. "EF", "EUCLIEAN FILL",
  369. SETTING_DOMAIN_PART, { PART_SEQUENCER_EUCLIDEAN_FILL, 0 },
  370. SETTING_UNIT_UINT8, 0, 32, NULL,
  371. 108, 30,
  372. },
  373. {
  374. "ER", "EUCLIEAN ROTATE",
  375. SETTING_DOMAIN_PART, { PART_SEQUENCER_EUCLIDEAN_ROTATE, 0 },
  376. SETTING_UNIT_UINT8, 0, 32, NULL,
  377. 109, 31,
  378. },
  379. {
  380. "RC", "REMOTE CONTROL CHANNEL",
  381. SETTING_DOMAIN_MULTI, { MULTI_REMOTE_CONTROL_CHANNEL, 0 },
  382. SETTING_UNIT_MIDI_CHANNEL_OFF, 0, 16, NULL,
  383. 0, 0,
  384. }
  385. };
  386. const SettingIndex mono_menu[] = {
  387. SETTING_LAYOUT,
  388. SETTING_CLOCK_TEMPO,
  389. SETTING_CLOCK_SWING,
  390. SETTING_CLOCK_INPUT_DIVISION,
  391. SETTING_CLOCK_OUTPUT_DIVISION,
  392. SETTING_CLOCK_BAR_DURATION,
  393. SETTING_MIDI_CHANNEL,
  394. SETTING_MIDI_OUT_MODE,
  395. SETTING_VOICING_ALLOCATION_PRIORITY,
  396. SETTING_VOICING_LEGATO_MODE,
  397. SETTING_VOICING_PORTAMENTO,
  398. SETTING_VOICING_PITCH_BEND_RANGE,
  399. SETTING_VOICING_VIBRATO_RANGE,
  400. SETTING_VOICING_MODULATION_RATE,
  401. SETTING_VOICING_TRIGGER_DURATION,
  402. SETTING_VOICING_CV_OUT_3,
  403. SETTING_VOICING_CV_OUT_4,
  404. SETTING_VOICING_AUDIO_MODE,
  405. SETTING_SEQUENCER_CLOCK_DIVISION,
  406. SETTING_SEQUENCER_GATE_LENGTH,
  407. SETTING_SEQUENCER_ARP_RANGE,
  408. SETTING_SEQUENCER_ARP_DIRECTION_NO_CHORD,
  409. SETTING_SEQUENCER_ARP_PATTERN,
  410. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  411. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  412. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  413. SETTING_VOICING_TUNING_TRANSPOSE,
  414. SETTING_VOICING_TUNING_FINE,
  415. SETTING_VOICING_TUNING_SYSTEM,
  416. SETTING_VOICING_TUNING_ROOT,
  417. SETTING_REMOTE_CONTROL_CHANNEL,
  418. SETTING_LAST
  419. };
  420. const SettingIndex dual_mono_menu[] = {
  421. SETTING_LAYOUT,
  422. SETTING_CLOCK_TEMPO,
  423. SETTING_CLOCK_SWING,
  424. SETTING_CLOCK_INPUT_DIVISION,
  425. SETTING_CLOCK_OUTPUT_DIVISION,
  426. SETTING_CLOCK_BAR_DURATION,
  427. SETTING_ACTIVE_PART_2,
  428. SETTING_MIDI_CHANNEL,
  429. SETTING_MIDI_OUT_MODE,
  430. SETTING_VOICING_ALLOCATION_PRIORITY,
  431. SETTING_VOICING_LEGATO_MODE,
  432. SETTING_VOICING_PORTAMENTO,
  433. SETTING_VOICING_PITCH_BEND_RANGE,
  434. SETTING_VOICING_VIBRATO_RANGE,
  435. SETTING_VOICING_MODULATION_RATE,
  436. SETTING_VOICING_CV_OUT,
  437. SETTING_VOICING_AUDIO_MODE,
  438. SETTING_SEQUENCER_CLOCK_DIVISION,
  439. SETTING_SEQUENCER_GATE_LENGTH,
  440. SETTING_SEQUENCER_ARP_RANGE,
  441. SETTING_SEQUENCER_ARP_DIRECTION,
  442. SETTING_SEQUENCER_ARP_PATTERN,
  443. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  444. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  445. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  446. SETTING_VOICING_TUNING_TRANSPOSE,
  447. SETTING_VOICING_TUNING_FINE,
  448. SETTING_VOICING_TUNING_SYSTEM,
  449. SETTING_VOICING_TUNING_ROOT,
  450. SETTING_REMOTE_CONTROL_CHANNEL,
  451. SETTING_LAST
  452. };
  453. const SettingIndex quad_mono_menu[] = {
  454. SETTING_LAYOUT,
  455. SETTING_CLOCK_TEMPO,
  456. SETTING_CLOCK_SWING,
  457. SETTING_CLOCK_INPUT_DIVISION,
  458. SETTING_CLOCK_OVERRIDE,
  459. SETTING_CLOCK_OUTPUT_DIVISION,
  460. SETTING_CLOCK_BAR_DURATION,
  461. SETTING_ACTIVE_PART_4,
  462. SETTING_MIDI_CHANNEL,
  463. SETTING_MIDI_OUT_MODE,
  464. SETTING_VOICING_ALLOCATION_PRIORITY,
  465. SETTING_VOICING_LEGATO_MODE,
  466. SETTING_VOICING_PORTAMENTO,
  467. SETTING_VOICING_PITCH_BEND_RANGE,
  468. SETTING_VOICING_VIBRATO_RANGE,
  469. SETTING_VOICING_MODULATION_RATE,
  470. SETTING_VOICING_AUDIO_MODE,
  471. SETTING_SEQUENCER_CLOCK_DIVISION,
  472. SETTING_SEQUENCER_GATE_LENGTH,
  473. SETTING_SEQUENCER_ARP_RANGE,
  474. SETTING_SEQUENCER_ARP_DIRECTION,
  475. SETTING_SEQUENCER_ARP_PATTERN,
  476. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  477. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  478. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  479. SETTING_VOICING_TUNING_TRANSPOSE,
  480. SETTING_VOICING_TUNING_FINE,
  481. SETTING_VOICING_TUNING_SYSTEM,
  482. SETTING_VOICING_TUNING_ROOT,
  483. SETTING_REMOTE_CONTROL_CHANNEL,
  484. SETTING_LAST
  485. };
  486. const SettingIndex dual_poly_menu[] = {
  487. SETTING_LAYOUT,
  488. SETTING_CLOCK_TEMPO,
  489. SETTING_CLOCK_SWING,
  490. SETTING_CLOCK_INPUT_DIVISION,
  491. SETTING_CLOCK_OUTPUT_DIVISION,
  492. SETTING_CLOCK_BAR_DURATION,
  493. SETTING_MIDI_CHANNEL,
  494. SETTING_MIDI_OUT_MODE,
  495. SETTING_VOICING_ALLOCATION_MODE,
  496. SETTING_VOICING_PORTAMENTO,
  497. SETTING_VOICING_PITCH_BEND_RANGE,
  498. SETTING_VOICING_VIBRATO_RANGE,
  499. SETTING_VOICING_MODULATION_RATE,
  500. SETTING_VOICING_CV_OUT_3,
  501. SETTING_VOICING_CV_OUT_4,
  502. SETTING_VOICING_AUDIO_MODE,
  503. SETTING_SEQUENCER_CLOCK_DIVISION,
  504. SETTING_SEQUENCER_GATE_LENGTH,
  505. SETTING_SEQUENCER_ARP_RANGE,
  506. SETTING_SEQUENCER_ARP_DIRECTION,
  507. SETTING_SEQUENCER_ARP_PATTERN,
  508. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  509. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  510. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  511. SETTING_VOICING_TUNING_TRANSPOSE,
  512. SETTING_VOICING_TUNING_FINE,
  513. SETTING_VOICING_TUNING_SYSTEM,
  514. SETTING_VOICING_TUNING_ROOT,
  515. SETTING_REMOTE_CONTROL_CHANNEL,
  516. SETTING_LAST
  517. };
  518. const SettingIndex quad_poly_menu[] = {
  519. SETTING_LAYOUT,
  520. SETTING_CLOCK_TEMPO,
  521. SETTING_CLOCK_SWING,
  522. SETTING_CLOCK_INPUT_DIVISION,
  523. SETTING_CLOCK_OVERRIDE,
  524. SETTING_CLOCK_OUTPUT_DIVISION,
  525. SETTING_CLOCK_BAR_DURATION,
  526. SETTING_MIDI_CHANNEL,
  527. SETTING_MIDI_OUT_MODE,
  528. SETTING_VOICING_ALLOCATION_MODE,
  529. SETTING_VOICING_PORTAMENTO,
  530. SETTING_VOICING_PITCH_BEND_RANGE,
  531. SETTING_VOICING_VIBRATO_RANGE,
  532. SETTING_VOICING_MODULATION_RATE,
  533. SETTING_VOICING_AUDIO_MODE,
  534. SETTING_SEQUENCER_CLOCK_DIVISION,
  535. SETTING_SEQUENCER_GATE_LENGTH,
  536. SETTING_SEQUENCER_ARP_RANGE,
  537. SETTING_SEQUENCER_ARP_DIRECTION,
  538. SETTING_SEQUENCER_ARP_PATTERN,
  539. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  540. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  541. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  542. SETTING_VOICING_TUNING_TRANSPOSE,
  543. SETTING_VOICING_TUNING_FINE,
  544. SETTING_VOICING_TUNING_SYSTEM,
  545. SETTING_VOICING_TUNING_ROOT,
  546. SETTING_REMOTE_CONTROL_CHANNEL,
  547. SETTING_LAST
  548. };
  549. const SettingIndex dual_polychained_menu[] = {
  550. SETTING_LAYOUT,
  551. SETTING_CLOCK_TEMPO,
  552. SETTING_CLOCK_SWING,
  553. SETTING_CLOCK_INPUT_DIVISION,
  554. SETTING_CLOCK_OUTPUT_DIVISION,
  555. SETTING_CLOCK_BAR_DURATION,
  556. SETTING_MIDI_CHANNEL,
  557. SETTING_MIDI_OUT_MODE,
  558. SETTING_VOICING_PORTAMENTO,
  559. SETTING_VOICING_PITCH_BEND_RANGE,
  560. SETTING_VOICING_VIBRATO_RANGE,
  561. SETTING_VOICING_MODULATION_RATE,
  562. SETTING_VOICING_CV_OUT_3,
  563. SETTING_VOICING_CV_OUT_4,
  564. SETTING_VOICING_AUDIO_MODE,
  565. SETTING_SEQUENCER_CLOCK_DIVISION,
  566. SETTING_SEQUENCER_GATE_LENGTH,
  567. SETTING_SEQUENCER_ARP_RANGE,
  568. SETTING_SEQUENCER_ARP_DIRECTION,
  569. SETTING_SEQUENCER_ARP_PATTERN,
  570. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  571. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  572. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  573. SETTING_VOICING_TUNING_TRANSPOSE,
  574. SETTING_VOICING_TUNING_FINE,
  575. SETTING_VOICING_TUNING_SYSTEM,
  576. SETTING_VOICING_TUNING_ROOT,
  577. SETTING_REMOTE_CONTROL_CHANNEL,
  578. SETTING_LAST
  579. };
  580. const SettingIndex quad_polychained_menu[] = {
  581. SETTING_LAYOUT,
  582. SETTING_CLOCK_TEMPO,
  583. SETTING_CLOCK_SWING,
  584. SETTING_CLOCK_INPUT_DIVISION,
  585. SETTING_CLOCK_OUTPUT_DIVISION,
  586. SETTING_CLOCK_BAR_DURATION,
  587. SETTING_MIDI_CHANNEL,
  588. SETTING_MIDI_OUT_MODE,
  589. SETTING_VOICING_PORTAMENTO,
  590. SETTING_VOICING_PITCH_BEND_RANGE,
  591. SETTING_VOICING_VIBRATO_RANGE,
  592. SETTING_VOICING_MODULATION_RATE,
  593. SETTING_VOICING_CV_OUT_3,
  594. SETTING_VOICING_CV_OUT_4,
  595. SETTING_VOICING_AUDIO_MODE,
  596. SETTING_SEQUENCER_CLOCK_DIVISION,
  597. SETTING_SEQUENCER_GATE_LENGTH,
  598. SETTING_SEQUENCER_ARP_RANGE,
  599. SETTING_SEQUENCER_ARP_DIRECTION,
  600. SETTING_SEQUENCER_ARP_PATTERN,
  601. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  602. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  603. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  604. SETTING_VOICING_TUNING_TRANSPOSE,
  605. SETTING_VOICING_TUNING_FINE,
  606. SETTING_VOICING_TUNING_SYSTEM,
  607. SETTING_VOICING_TUNING_ROOT,
  608. SETTING_REMOTE_CONTROL_CHANNEL,
  609. SETTING_LAST
  610. };
  611. const SettingIndex octal_polychained_menu[] = {
  612. SETTING_LAYOUT,
  613. SETTING_CLOCK_TEMPO,
  614. SETTING_CLOCK_SWING,
  615. SETTING_CLOCK_INPUT_DIVISION,
  616. SETTING_CLOCK_OVERRIDE,
  617. SETTING_CLOCK_OUTPUT_DIVISION,
  618. SETTING_CLOCK_BAR_DURATION,
  619. SETTING_MIDI_CHANNEL,
  620. SETTING_MIDI_OUT_MODE,
  621. SETTING_VOICING_PORTAMENTO,
  622. SETTING_VOICING_PITCH_BEND_RANGE,
  623. SETTING_VOICING_VIBRATO_RANGE,
  624. SETTING_VOICING_MODULATION_RATE,
  625. SETTING_VOICING_AUDIO_MODE,
  626. SETTING_SEQUENCER_CLOCK_DIVISION,
  627. SETTING_SEQUENCER_GATE_LENGTH,
  628. SETTING_SEQUENCER_ARP_RANGE,
  629. SETTING_SEQUENCER_ARP_DIRECTION,
  630. SETTING_SEQUENCER_ARP_PATTERN,
  631. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  632. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  633. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  634. SETTING_VOICING_TUNING_TRANSPOSE,
  635. SETTING_VOICING_TUNING_FINE,
  636. SETTING_VOICING_TUNING_SYSTEM,
  637. SETTING_VOICING_TUNING_ROOT,
  638. SETTING_REMOTE_CONTROL_CHANNEL,
  639. SETTING_LAST
  640. };
  641. const SettingIndex quad_triggers_menu[] = {
  642. SETTING_LAYOUT,
  643. SETTING_CLOCK_TEMPO,
  644. SETTING_CLOCK_SWING,
  645. SETTING_CLOCK_INPUT_DIVISION,
  646. SETTING_ACTIVE_PART_4,
  647. SETTING_MIDI_CHANNEL,
  648. SETTING_MIDI_NOTE,
  649. SETTING_MIDI_OUT_MODE,
  650. SETTING_VOICING_TRIGGER_DURATION,
  651. SETTING_VOICING_TRIGGER_SCALE,
  652. SETTING_VOICING_TRIGGER_SHAPE,
  653. SETTING_SEQUENCER_CLOCK_DIVISION,
  654. SETTING_SEQUENCER_RHYTHM_GENERATOR,
  655. SETTING_SEQUENCER_RHYTHM_PATTERN,
  656. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  657. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  658. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  659. SETTING_REMOTE_CONTROL_CHANNEL,
  660. SETTING_LAST
  661. };
  662. const SettingIndex three_one_menu[] = {
  663. SETTING_LAYOUT,
  664. SETTING_CLOCK_TEMPO,
  665. SETTING_CLOCK_SWING,
  666. SETTING_CLOCK_INPUT_DIVISION,
  667. SETTING_CLOCK_OUTPUT_DIVISION,
  668. SETTING_CLOCK_BAR_DURATION,
  669. SETTING_ACTIVE_PART_2,
  670. SETTING_MIDI_CHANNEL,
  671. SETTING_MIDI_OUT_MODE,
  672. SETTING_VOICING_ALLOCATION_MODE,
  673. SETTING_VOICING_ALLOCATION_PRIORITY,
  674. SETTING_VOICING_LEGATO_MODE,
  675. SETTING_VOICING_PORTAMENTO,
  676. SETTING_VOICING_PITCH_BEND_RANGE,
  677. SETTING_VOICING_VIBRATO_RANGE,
  678. SETTING_VOICING_MODULATION_RATE,
  679. SETTING_VOICING_AUDIO_MODE,
  680. SETTING_SEQUENCER_CLOCK_DIVISION,
  681. SETTING_SEQUENCER_GATE_LENGTH,
  682. SETTING_SEQUENCER_ARP_RANGE,
  683. SETTING_SEQUENCER_ARP_DIRECTION,
  684. SETTING_SEQUENCER_ARP_PATTERN,
  685. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  686. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  687. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  688. SETTING_VOICING_TUNING_TRANSPOSE,
  689. SETTING_VOICING_TUNING_FINE,
  690. SETTING_VOICING_TUNING_SYSTEM,
  691. SETTING_VOICING_TUNING_ROOT,
  692. SETTING_REMOTE_CONTROL_CHANNEL,
  693. SETTING_LAST
  694. };
  695. const SettingIndex quad_voltages_menu[] = {
  696. SETTING_LAYOUT,
  697. SETTING_ACTIVE_PART_4,
  698. SETTING_MIDI_CHANNEL,
  699. SETTING_VOICING_CV_OUT,
  700. SETTING_CLOCK_TEMPO,
  701. SETTING_CLOCK_SWING,
  702. SETTING_CLOCK_INPUT_DIVISION,
  703. SETTING_CLOCK_OVERRIDE,
  704. SETTING_CLOCK_OUTPUT_DIVISION,
  705. SETTING_CLOCK_BAR_DURATION,
  706. SETTING_REMOTE_CONTROL_CHANNEL,
  707. SETTING_LAST
  708. };
  709. const SettingIndex* const Settings::menus_[] = {
  710. mono_menu,
  711. dual_mono_menu,
  712. quad_mono_menu,
  713. dual_poly_menu,
  714. quad_poly_menu,
  715. dual_polychained_menu,
  716. quad_polychained_menu,
  717. octal_polychained_menu,
  718. quad_triggers_menu,
  719. quad_voltages_menu,
  720. three_one_menu
  721. };
  722. void Settings::Init() {
  723. global_.active_part = 0;
  724. // Build tables used to convert from a CC to a parameter number.
  725. std::fill(&part_cc_map_[0], &part_cc_map_[128], 0xff);
  726. std::fill(&remote_control_cc_map_[0], &remote_control_cc_map_[128], 0xff);
  727. for (uint8_t i = 0; i < SETTING_LAST; ++i) {
  728. const Setting& setting = settings_[i];
  729. if (setting.part_cc) {
  730. if (setting.domain != SETTING_DOMAIN_PART) while (1);
  731. part_cc_map_[setting.part_cc] = i;
  732. }
  733. if (setting.remote_control_cc) {
  734. uint8_t num_instances = setting.domain == SETTING_DOMAIN_PART ? 4 : 1;
  735. for (uint8_t j = 0; j < num_instances; ++j) {
  736. remote_control_cc_map_[setting.remote_control_cc + j * 32] = i;
  737. }
  738. }
  739. }
  740. }
  741. void Settings::Set(uint8_t address, uint8_t value) {
  742. uint8_t* bytes;
  743. bytes = static_cast<uint8_t*>(static_cast<void*>(&global_));
  744. bytes[address] = value;
  745. }
  746. void Settings::SetFromCC(
  747. uint8_t part_index,
  748. uint8_t controller,
  749. uint8_t value) {
  750. uint8_t* map = part_index == 0xff ? remote_control_cc_map_ : part_cc_map_;
  751. uint8_t part = part_index == 0xff ? controller >> 5 : part_index;
  752. uint8_t setting_index = map[controller];
  753. if (setting_index != 0xff) {
  754. const Setting& setting = settings_[setting_index];
  755. Set(setting, &part, setting.Scale(value));
  756. }
  757. }
  758. void Settings::Set(const Setting& setting, uint8_t* part, uint8_t value) {
  759. switch (setting.domain) {
  760. case SETTING_DOMAIN_GLOBAL:
  761. Set(setting.address[0], value);
  762. break;
  763. case SETTING_DOMAIN_MULTI:
  764. multi.Set(setting.address[0], value);
  765. if (*part >= multi.num_active_parts()) {
  766. *part = multi.num_active_parts() - 1;
  767. }
  768. break;
  769. case SETTING_DOMAIN_PART:
  770. multi.mutable_part(*part)->Set(setting.address[0], value);
  771. // When the module is configured in *triggers* mode, each part is mapped
  772. // to a single note. To edit this setting, both the "note min" and
  773. // "note max" parameters are simultaneously changed to the same value.
  774. // This is a bit more user friendly than letting the user set note min
  775. // and note max to the same value.
  776. if (setting.address[1]) {
  777. multi.mutable_part(*part)->Set(setting.address[1], value);
  778. }
  779. break;
  780. }
  781. }
  782. void Settings::Set(const Setting& setting, uint8_t value) {
  783. Set(setting, &global_.active_part, value);
  784. }
  785. uint8_t Settings::Get(const Setting& setting) const {
  786. uint8_t value = 0;
  787. switch (setting.domain) {
  788. case SETTING_DOMAIN_GLOBAL:
  789. value = Get(setting.address[0]);
  790. break;
  791. case SETTING_DOMAIN_MULTI:
  792. value = multi.Get(setting.address[0]);
  793. break;
  794. case SETTING_DOMAIN_PART:
  795. value = multi.part(global_.active_part).Get(setting.address[0]);
  796. break;
  797. }
  798. return value;
  799. }
  800. void Settings::Print(const Setting& setting, char* buffer) const {
  801. uint8_t value = Get(setting);
  802. switch (setting.unit) {
  803. case SETTING_UNIT_UINT8:
  804. PrintInteger(buffer, value);
  805. break;
  806. case SETTING_UNIT_INT8:
  807. {
  808. int8_t value_signed = value;
  809. if (value_signed >= 0) {
  810. PrintInteger(buffer, value_signed);
  811. } else if (value_signed > -10){
  812. PrintInteger(buffer, -value_signed);
  813. buffer[0] = '-';
  814. } else {
  815. PrintInteger(buffer, -value_signed);
  816. buffer[2] = ' ';
  817. buffer[3] = '-';
  818. buffer[4] = buffer[0];
  819. buffer[5] = buffer[1];
  820. buffer[6] = '\0';
  821. }
  822. }
  823. break;
  824. case SETTING_UNIT_INDEX:
  825. PrintInteger(buffer, value + 1);
  826. break;
  827. case SETTING_UNIT_BAR_DURATION:
  828. if (value <= kMaxBarDuration) {
  829. PrintInteger(buffer, value);
  830. } else {
  831. strcpy(buffer, "oo");
  832. }
  833. break;
  834. case SETTING_UNIT_TEMPO:
  835. if (value == 39) {
  836. strcpy(buffer, "EXTERNAL");
  837. } else {
  838. PrintInteger(buffer, value);
  839. }
  840. break;
  841. case SETTING_UNIT_MIDI_CHANNEL:
  842. if (value == 0x10) {
  843. strcpy(buffer, "ALL");
  844. } else {
  845. PrintInteger(buffer, value + 1);
  846. }
  847. break;
  848. case SETTING_UNIT_MIDI_CHANNEL_OFF:
  849. if (value == 0x00) {
  850. strcpy(buffer, "OFF");
  851. } else {
  852. PrintInteger(buffer, value);
  853. }
  854. break;
  855. case SETTING_UNIT_VIBRATO_SPEED:
  856. if (value < 100) {
  857. PrintInteger(buffer, value);
  858. } else {
  859. strcpy(buffer, clock_division_values[value - 100]);
  860. }
  861. break;
  862. case SETTING_UNIT_PORTAMENTO:
  863. if (value <= 50) {
  864. PrintInteger(buffer, value);
  865. } else {
  866. PrintInteger(buffer, value - 51);
  867. }
  868. if (buffer[0] == ' ') {
  869. buffer[0] = (value <= 50) ? 'T' : 'R';
  870. }
  871. break;
  872. case SETTING_UNIT_ENUMERATION:
  873. strcpy(buffer, setting.values[value]);
  874. break;
  875. default:
  876. strcpy(buffer, "??");
  877. }
  878. }
  879. void Settings::Increment(const Setting& setting, int16_t increment) {
  880. int16_t value = Get(setting);
  881. if (setting.unit == SETTING_UNIT_INT8) {
  882. value = static_cast<int8_t>(value);
  883. }
  884. value += increment;
  885. if (value < setting.min_value) {
  886. value = setting.min_value;
  887. } else if (value > setting.max_value) {
  888. value = setting.max_value;
  889. }
  890. Set(setting, static_cast<uint8_t>(value));
  891. }
  892. /* static */
  893. void Settings::PrintInteger(char* buffer, uint8_t number) {
  894. buffer[1] = '0' + (number % 10);
  895. number /= 10;
  896. buffer[0] = number ? '0' + (number % 10) : ' ';
  897. number /= 10;
  898. buffer[2] = '\0';
  899. }
  900. /* extern */
  901. Settings settings;
  902. } // namespace yarns