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.

925 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", "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. "AT", "BREATH", "PEDAL", "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", "AUX. CV OUT",
  288. SETTING_DOMAIN_PART, { PART_VOICING_AUX_CV, 0 },
  289. SETTING_UNIT_ENUMERATION, 0, 4, voicing_aux_cv_values,
  290. 31, 22,
  291. },
  292. {
  293. "OS", "OSCILLATOR",
  294. SETTING_DOMAIN_PART, { PART_VOICING_AUDIO_MODE, 0 },
  295. SETTING_UNIT_ENUMERATION, 0, 6, voicing_oscillator_values,
  296. 71, 23,
  297. },
  298. {
  299. "C/", "CLOCK DIV",
  300. SETTING_DOMAIN_PART, { PART_SEQUENCER_CLOCK_DIVISION, 0 },
  301. SETTING_UNIT_ENUMERATION, 0, 11, clock_division_values,
  302. 102, 24,
  303. },
  304. {
  305. "G-", "GATE LENGTH",
  306. SETTING_DOMAIN_PART, { PART_SEQUENCER_GATE_LENGTH, 0 },
  307. SETTING_UNIT_UINT8, 1, 48, NULL,
  308. 103, 25,
  309. },
  310. {
  311. "AR", "ARP RANGE",
  312. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_RANGE, 0 },
  313. SETTING_UNIT_UINT8, 0, 4, NULL,
  314. 104, 26,
  315. },
  316. {
  317. "RG", "RHYTHMIC GENERATOR",
  318. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_RANGE, 0 },
  319. SETTING_UNIT_ENUMERATION, 0, 1, boolean_values,
  320. 0, 0,
  321. },
  322. {
  323. "AD", "ARP DIRECTION",
  324. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_DIRECTION, 0 },
  325. SETTING_UNIT_ENUMERATION, 0, ARPEGGIATOR_DIRECTION_LAST - 1,
  326. sequencer_arp_direction_values,
  327. 0, 0,
  328. },
  329. {
  330. // Variant without the CHORD option.
  331. "AD", "ARP DIRECTION",
  332. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_DIRECTION, 0 },
  333. SETTING_UNIT_ENUMERATION, 0, ARPEGGIATOR_DIRECTION_LAST - 2,
  334. sequencer_arp_direction_values,
  335. 105, 27,
  336. },
  337. {
  338. "AP", "ARP PATTERN",
  339. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_PATTERN, 0 },
  340. SETTING_UNIT_INDEX, 0, 21, NULL,
  341. 106, 28,
  342. },
  343. {
  344. "RP", "RHYTHMIC PATTERN",
  345. SETTING_DOMAIN_PART, { PART_SEQUENCER_ARP_PATTERN, 0 },
  346. SETTING_UNIT_INDEX, 0, 21, NULL,
  347. 0, 0,
  348. },
  349. {
  350. "E-", "EUCLIDEAN LENGTH",
  351. SETTING_DOMAIN_PART, { PART_SEQUENCER_EUCLIDEAN_LENGTH, 0 },
  352. SETTING_UNIT_UINT8, 0, 32, NULL,
  353. 107, 29,
  354. },
  355. {
  356. "EF", "EUCLIEAN FILL",
  357. SETTING_DOMAIN_PART, { PART_SEQUENCER_EUCLIDEAN_FILL, 0 },
  358. SETTING_UNIT_UINT8, 0, 32, NULL,
  359. 108, 30,
  360. },
  361. {
  362. "ER", "EUCLIEAN ROTATE",
  363. SETTING_DOMAIN_PART, { PART_SEQUENCER_EUCLIDEAN_ROTATE, 0 },
  364. SETTING_UNIT_UINT8, 0, 32, NULL,
  365. 109, 31,
  366. },
  367. {
  368. "RC", "REMOTE CONTROL CHANNEL",
  369. SETTING_DOMAIN_MULTI, { MULTI_REMOTE_CONTROL_CHANNEL, 0 },
  370. SETTING_UNIT_MIDI_CHANNEL_OFF, 0, 16, NULL,
  371. 0, 0,
  372. }
  373. };
  374. const SettingIndex mono_menu[] = {
  375. SETTING_LAYOUT,
  376. SETTING_CLOCK_TEMPO,
  377. SETTING_CLOCK_SWING,
  378. SETTING_CLOCK_INPUT_DIVISION,
  379. SETTING_CLOCK_OUTPUT_DIVISION,
  380. SETTING_CLOCK_BAR_DURATION,
  381. SETTING_MIDI_CHANNEL,
  382. SETTING_MIDI_OUT_MODE,
  383. SETTING_VOICING_ALLOCATION_PRIORITY,
  384. SETTING_VOICING_LEGATO_MODE,
  385. SETTING_VOICING_PORTAMENTO,
  386. SETTING_VOICING_PITCH_BEND_RANGE,
  387. SETTING_VOICING_VIBRATO_RANGE,
  388. SETTING_VOICING_MODULATION_RATE,
  389. SETTING_VOICING_TRIGGER_DURATION,
  390. SETTING_VOICING_AUX_CV,
  391. SETTING_VOICING_AUDIO_MODE,
  392. SETTING_SEQUENCER_CLOCK_DIVISION,
  393. SETTING_SEQUENCER_GATE_LENGTH,
  394. SETTING_SEQUENCER_ARP_RANGE,
  395. SETTING_SEQUENCER_ARP_DIRECTION_NO_CHORD,
  396. SETTING_SEQUENCER_ARP_PATTERN,
  397. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  398. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  399. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  400. SETTING_VOICING_TUNING_TRANSPOSE,
  401. SETTING_VOICING_TUNING_FINE,
  402. SETTING_VOICING_TUNING_SYSTEM,
  403. SETTING_VOICING_TUNING_ROOT,
  404. SETTING_REMOTE_CONTROL_CHANNEL,
  405. SETTING_LAST
  406. };
  407. const SettingIndex dual_mono_menu[] = {
  408. SETTING_LAYOUT,
  409. SETTING_CLOCK_TEMPO,
  410. SETTING_CLOCK_SWING,
  411. SETTING_CLOCK_INPUT_DIVISION,
  412. SETTING_CLOCK_OUTPUT_DIVISION,
  413. SETTING_CLOCK_BAR_DURATION,
  414. SETTING_ACTIVE_PART_2,
  415. SETTING_MIDI_CHANNEL,
  416. SETTING_MIDI_OUT_MODE,
  417. SETTING_VOICING_ALLOCATION_PRIORITY,
  418. SETTING_VOICING_LEGATO_MODE,
  419. SETTING_VOICING_PORTAMENTO,
  420. SETTING_VOICING_PITCH_BEND_RANGE,
  421. SETTING_VOICING_VIBRATO_RANGE,
  422. SETTING_VOICING_MODULATION_RATE,
  423. SETTING_VOICING_AUX_CV,
  424. SETTING_VOICING_AUDIO_MODE,
  425. SETTING_SEQUENCER_CLOCK_DIVISION,
  426. SETTING_SEQUENCER_GATE_LENGTH,
  427. SETTING_SEQUENCER_ARP_RANGE,
  428. SETTING_SEQUENCER_ARP_DIRECTION,
  429. SETTING_SEQUENCER_ARP_PATTERN,
  430. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  431. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  432. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  433. SETTING_VOICING_TUNING_TRANSPOSE,
  434. SETTING_VOICING_TUNING_FINE,
  435. SETTING_VOICING_TUNING_SYSTEM,
  436. SETTING_VOICING_TUNING_ROOT,
  437. SETTING_REMOTE_CONTROL_CHANNEL,
  438. SETTING_LAST
  439. };
  440. const SettingIndex quad_mono_menu[] = {
  441. SETTING_LAYOUT,
  442. SETTING_CLOCK_TEMPO,
  443. SETTING_CLOCK_SWING,
  444. SETTING_CLOCK_INPUT_DIVISION,
  445. SETTING_CLOCK_OVERRIDE,
  446. SETTING_CLOCK_OUTPUT_DIVISION,
  447. SETTING_CLOCK_BAR_DURATION,
  448. SETTING_ACTIVE_PART_4,
  449. SETTING_MIDI_CHANNEL,
  450. SETTING_MIDI_OUT_MODE,
  451. SETTING_VOICING_ALLOCATION_PRIORITY,
  452. SETTING_VOICING_LEGATO_MODE,
  453. SETTING_VOICING_PORTAMENTO,
  454. SETTING_VOICING_PITCH_BEND_RANGE,
  455. SETTING_VOICING_VIBRATO_RANGE,
  456. SETTING_VOICING_MODULATION_RATE,
  457. SETTING_VOICING_AUDIO_MODE,
  458. SETTING_SEQUENCER_CLOCK_DIVISION,
  459. SETTING_SEQUENCER_GATE_LENGTH,
  460. SETTING_SEQUENCER_ARP_RANGE,
  461. SETTING_SEQUENCER_ARP_DIRECTION,
  462. SETTING_SEQUENCER_ARP_PATTERN,
  463. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  464. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  465. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  466. SETTING_VOICING_TUNING_TRANSPOSE,
  467. SETTING_VOICING_TUNING_FINE,
  468. SETTING_VOICING_TUNING_SYSTEM,
  469. SETTING_VOICING_TUNING_ROOT,
  470. SETTING_REMOTE_CONTROL_CHANNEL,
  471. SETTING_LAST
  472. };
  473. const SettingIndex dual_poly_menu[] = {
  474. SETTING_LAYOUT,
  475. SETTING_CLOCK_TEMPO,
  476. SETTING_CLOCK_SWING,
  477. SETTING_CLOCK_INPUT_DIVISION,
  478. SETTING_CLOCK_OUTPUT_DIVISION,
  479. SETTING_CLOCK_BAR_DURATION,
  480. SETTING_MIDI_CHANNEL,
  481. SETTING_MIDI_OUT_MODE,
  482. SETTING_VOICING_ALLOCATION_MODE,
  483. SETTING_VOICING_PORTAMENTO,
  484. SETTING_VOICING_PITCH_BEND_RANGE,
  485. SETTING_VOICING_VIBRATO_RANGE,
  486. SETTING_VOICING_MODULATION_RATE,
  487. SETTING_VOICING_AUX_CV,
  488. SETTING_VOICING_AUDIO_MODE,
  489. SETTING_SEQUENCER_CLOCK_DIVISION,
  490. SETTING_SEQUENCER_GATE_LENGTH,
  491. SETTING_SEQUENCER_ARP_RANGE,
  492. SETTING_SEQUENCER_ARP_DIRECTION,
  493. SETTING_SEQUENCER_ARP_PATTERN,
  494. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  495. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  496. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  497. SETTING_VOICING_TUNING_TRANSPOSE,
  498. SETTING_VOICING_TUNING_FINE,
  499. SETTING_VOICING_TUNING_SYSTEM,
  500. SETTING_VOICING_TUNING_ROOT,
  501. SETTING_REMOTE_CONTROL_CHANNEL,
  502. SETTING_LAST
  503. };
  504. const SettingIndex quad_poly_menu[] = {
  505. SETTING_LAYOUT,
  506. SETTING_CLOCK_TEMPO,
  507. SETTING_CLOCK_SWING,
  508. SETTING_CLOCK_INPUT_DIVISION,
  509. SETTING_CLOCK_OVERRIDE,
  510. SETTING_CLOCK_OUTPUT_DIVISION,
  511. SETTING_CLOCK_BAR_DURATION,
  512. SETTING_MIDI_CHANNEL,
  513. SETTING_MIDI_OUT_MODE,
  514. SETTING_VOICING_ALLOCATION_MODE,
  515. SETTING_VOICING_PORTAMENTO,
  516. SETTING_VOICING_PITCH_BEND_RANGE,
  517. SETTING_VOICING_VIBRATO_RANGE,
  518. SETTING_VOICING_MODULATION_RATE,
  519. SETTING_VOICING_AUDIO_MODE,
  520. SETTING_SEQUENCER_CLOCK_DIVISION,
  521. SETTING_SEQUENCER_GATE_LENGTH,
  522. SETTING_SEQUENCER_ARP_RANGE,
  523. SETTING_SEQUENCER_ARP_DIRECTION,
  524. SETTING_SEQUENCER_ARP_PATTERN,
  525. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  526. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  527. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  528. SETTING_VOICING_TUNING_TRANSPOSE,
  529. SETTING_VOICING_TUNING_FINE,
  530. SETTING_VOICING_TUNING_SYSTEM,
  531. SETTING_VOICING_TUNING_ROOT,
  532. SETTING_REMOTE_CONTROL_CHANNEL,
  533. SETTING_LAST
  534. };
  535. const SettingIndex dual_polychained_menu[] = {
  536. SETTING_LAYOUT,
  537. SETTING_CLOCK_TEMPO,
  538. SETTING_CLOCK_SWING,
  539. SETTING_CLOCK_INPUT_DIVISION,
  540. SETTING_CLOCK_OUTPUT_DIVISION,
  541. SETTING_CLOCK_BAR_DURATION,
  542. SETTING_MIDI_CHANNEL,
  543. SETTING_MIDI_OUT_MODE,
  544. SETTING_VOICING_PORTAMENTO,
  545. SETTING_VOICING_PITCH_BEND_RANGE,
  546. SETTING_VOICING_VIBRATO_RANGE,
  547. SETTING_VOICING_MODULATION_RATE,
  548. SETTING_VOICING_AUX_CV,
  549. SETTING_VOICING_AUDIO_MODE,
  550. SETTING_SEQUENCER_CLOCK_DIVISION,
  551. SETTING_SEQUENCER_GATE_LENGTH,
  552. SETTING_SEQUENCER_ARP_RANGE,
  553. SETTING_SEQUENCER_ARP_DIRECTION,
  554. SETTING_SEQUENCER_ARP_PATTERN,
  555. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  556. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  557. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  558. SETTING_VOICING_TUNING_TRANSPOSE,
  559. SETTING_VOICING_TUNING_FINE,
  560. SETTING_VOICING_TUNING_SYSTEM,
  561. SETTING_VOICING_TUNING_ROOT,
  562. SETTING_REMOTE_CONTROL_CHANNEL,
  563. SETTING_LAST
  564. };
  565. const SettingIndex quad_polychained_menu[] = {
  566. SETTING_LAYOUT,
  567. SETTING_CLOCK_TEMPO,
  568. SETTING_CLOCK_SWING,
  569. SETTING_CLOCK_INPUT_DIVISION,
  570. SETTING_CLOCK_OUTPUT_DIVISION,
  571. SETTING_CLOCK_BAR_DURATION,
  572. SETTING_MIDI_CHANNEL,
  573. SETTING_MIDI_OUT_MODE,
  574. SETTING_VOICING_PORTAMENTO,
  575. SETTING_VOICING_PITCH_BEND_RANGE,
  576. SETTING_VOICING_VIBRATO_RANGE,
  577. SETTING_VOICING_MODULATION_RATE,
  578. SETTING_VOICING_AUX_CV,
  579. SETTING_VOICING_AUDIO_MODE,
  580. SETTING_SEQUENCER_CLOCK_DIVISION,
  581. SETTING_SEQUENCER_GATE_LENGTH,
  582. SETTING_SEQUENCER_ARP_RANGE,
  583. SETTING_SEQUENCER_ARP_DIRECTION,
  584. SETTING_SEQUENCER_ARP_PATTERN,
  585. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  586. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  587. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  588. SETTING_VOICING_TUNING_TRANSPOSE,
  589. SETTING_VOICING_TUNING_FINE,
  590. SETTING_VOICING_TUNING_SYSTEM,
  591. SETTING_VOICING_TUNING_ROOT,
  592. SETTING_REMOTE_CONTROL_CHANNEL,
  593. SETTING_LAST
  594. };
  595. const SettingIndex octal_polychained_menu[] = {
  596. SETTING_LAYOUT,
  597. SETTING_CLOCK_TEMPO,
  598. SETTING_CLOCK_SWING,
  599. SETTING_CLOCK_INPUT_DIVISION,
  600. SETTING_CLOCK_OVERRIDE,
  601. SETTING_CLOCK_OUTPUT_DIVISION,
  602. SETTING_CLOCK_BAR_DURATION,
  603. SETTING_MIDI_CHANNEL,
  604. SETTING_MIDI_OUT_MODE,
  605. SETTING_VOICING_PORTAMENTO,
  606. SETTING_VOICING_PITCH_BEND_RANGE,
  607. SETTING_VOICING_VIBRATO_RANGE,
  608. SETTING_VOICING_MODULATION_RATE,
  609. SETTING_VOICING_AUDIO_MODE,
  610. SETTING_SEQUENCER_CLOCK_DIVISION,
  611. SETTING_SEQUENCER_GATE_LENGTH,
  612. SETTING_SEQUENCER_ARP_RANGE,
  613. SETTING_SEQUENCER_ARP_DIRECTION,
  614. SETTING_SEQUENCER_ARP_PATTERN,
  615. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  616. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  617. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  618. SETTING_VOICING_TUNING_TRANSPOSE,
  619. SETTING_VOICING_TUNING_FINE,
  620. SETTING_VOICING_TUNING_SYSTEM,
  621. SETTING_VOICING_TUNING_ROOT,
  622. SETTING_REMOTE_CONTROL_CHANNEL,
  623. SETTING_LAST
  624. };
  625. const SettingIndex quad_triggers_menu[] = {
  626. SETTING_LAYOUT,
  627. SETTING_CLOCK_TEMPO,
  628. SETTING_CLOCK_SWING,
  629. SETTING_CLOCK_INPUT_DIVISION,
  630. SETTING_ACTIVE_PART_4,
  631. SETTING_MIDI_CHANNEL,
  632. SETTING_MIDI_NOTE,
  633. SETTING_MIDI_OUT_MODE,
  634. SETTING_VOICING_TRIGGER_DURATION,
  635. SETTING_VOICING_TRIGGER_SCALE,
  636. SETTING_VOICING_TRIGGER_SHAPE,
  637. SETTING_SEQUENCER_CLOCK_DIVISION,
  638. SETTING_SEQUENCER_RHYTHM_GENERATOR,
  639. SETTING_SEQUENCER_RHYTHM_PATTERN,
  640. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  641. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  642. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  643. SETTING_REMOTE_CONTROL_CHANNEL,
  644. SETTING_LAST
  645. };
  646. const SettingIndex three_one_menu[] = {
  647. SETTING_LAYOUT,
  648. SETTING_CLOCK_TEMPO,
  649. SETTING_CLOCK_SWING,
  650. SETTING_CLOCK_INPUT_DIVISION,
  651. SETTING_CLOCK_OUTPUT_DIVISION,
  652. SETTING_CLOCK_BAR_DURATION,
  653. SETTING_ACTIVE_PART_2,
  654. SETTING_MIDI_CHANNEL,
  655. SETTING_MIDI_OUT_MODE,
  656. SETTING_VOICING_ALLOCATION_MODE,
  657. SETTING_VOICING_ALLOCATION_PRIORITY,
  658. SETTING_VOICING_LEGATO_MODE,
  659. SETTING_VOICING_PORTAMENTO,
  660. SETTING_VOICING_PITCH_BEND_RANGE,
  661. SETTING_VOICING_VIBRATO_RANGE,
  662. SETTING_VOICING_MODULATION_RATE,
  663. SETTING_VOICING_AUDIO_MODE,
  664. SETTING_SEQUENCER_CLOCK_DIVISION,
  665. SETTING_SEQUENCER_GATE_LENGTH,
  666. SETTING_SEQUENCER_ARP_RANGE,
  667. SETTING_SEQUENCER_ARP_DIRECTION,
  668. SETTING_SEQUENCER_ARP_PATTERN,
  669. SETTING_SEQUENCER_EUCLIDEAN_LENGTH,
  670. SETTING_SEQUENCER_EUCLIDEAN_FILL,
  671. SETTING_SEQUENCER_EUCLIDEAN_ROTATE,
  672. SETTING_VOICING_TUNING_TRANSPOSE,
  673. SETTING_VOICING_TUNING_FINE,
  674. SETTING_VOICING_TUNING_SYSTEM,
  675. SETTING_VOICING_TUNING_ROOT,
  676. SETTING_REMOTE_CONTROL_CHANNEL,
  677. SETTING_LAST
  678. };
  679. const SettingIndex* const Settings::menus_[] = {
  680. mono_menu,
  681. dual_mono_menu,
  682. quad_mono_menu,
  683. dual_poly_menu,
  684. quad_poly_menu,
  685. dual_polychained_menu,
  686. quad_polychained_menu,
  687. octal_polychained_menu,
  688. quad_triggers_menu,
  689. three_one_menu
  690. };
  691. void Settings::Init() {
  692. global_.active_part = 0;
  693. // Build tables used to convert from a CC to a parameter number.
  694. std::fill(&part_cc_map_[0], &part_cc_map_[128], 0xff);
  695. std::fill(&remote_control_cc_map_[0], &remote_control_cc_map_[128], 0xff);
  696. for (uint8_t i = 0; i < SETTING_LAST; ++i) {
  697. const Setting& setting = settings_[i];
  698. if (setting.part_cc) {
  699. if (setting.domain != SETTING_DOMAIN_PART) while (1);
  700. part_cc_map_[setting.part_cc] = i;
  701. }
  702. if (setting.remote_control_cc) {
  703. uint8_t num_instances = setting.domain == SETTING_DOMAIN_PART ? 4 : 1;
  704. for (uint8_t j = 0; j < num_instances; ++j) {
  705. remote_control_cc_map_[setting.remote_control_cc + j * 32] = i;
  706. }
  707. }
  708. }
  709. }
  710. void Settings::Set(uint8_t address, uint8_t value) {
  711. uint8_t* bytes;
  712. bytes = static_cast<uint8_t*>(static_cast<void*>(&global_));
  713. bytes[address] = value;
  714. }
  715. void Settings::SetFromCC(
  716. uint8_t part_index,
  717. uint8_t controller,
  718. uint8_t value) {
  719. uint8_t* map = part_index == 0xff ? remote_control_cc_map_ : part_cc_map_;
  720. uint8_t part = part_index == 0xff ? controller >> 5 : part_index;
  721. uint8_t setting_index = map[controller];
  722. if (setting_index != 0xff) {
  723. const Setting& setting = settings_[setting_index];
  724. Set(setting, &part, setting.Scale(value));
  725. }
  726. }
  727. void Settings::Set(const Setting& setting, uint8_t* part, uint8_t value) {
  728. switch (setting.domain) {
  729. case SETTING_DOMAIN_GLOBAL:
  730. Set(setting.address[0], value);
  731. break;
  732. case SETTING_DOMAIN_MULTI:
  733. multi.Set(setting.address[0], value);
  734. if (*part >= multi.num_active_parts()) {
  735. *part = multi.num_active_parts() - 1;
  736. }
  737. break;
  738. case SETTING_DOMAIN_PART:
  739. multi.mutable_part(*part)->Set(setting.address[0], value);
  740. // When the module is configured in *triggers* mode, each part is mapped
  741. // to a single note. To edit this setting, both the "note min" and
  742. // "note max" parameters are simultaneously changed to the same value.
  743. // This is a bit more user friendly than letting the user set note min
  744. // and note max to the same value.
  745. if (setting.address[1]) {
  746. multi.mutable_part(*part)->Set(setting.address[1], value);
  747. }
  748. break;
  749. }
  750. }
  751. void Settings::Set(const Setting& setting, uint8_t value) {
  752. Set(setting, &global_.active_part, value);
  753. }
  754. uint8_t Settings::Get(const Setting& setting) const {
  755. uint8_t value = 0;
  756. switch (setting.domain) {
  757. case SETTING_DOMAIN_GLOBAL:
  758. value = Get(setting.address[0]);
  759. break;
  760. case SETTING_DOMAIN_MULTI:
  761. value = multi.Get(setting.address[0]);
  762. break;
  763. case SETTING_DOMAIN_PART:
  764. value = multi.part(global_.active_part).Get(setting.address[0]);
  765. break;
  766. }
  767. return value;
  768. }
  769. void Settings::Print(const Setting& setting, char* buffer) const {
  770. uint8_t value = Get(setting);
  771. switch (setting.unit) {
  772. case SETTING_UNIT_UINT8:
  773. PrintInteger(buffer, value);
  774. break;
  775. case SETTING_UNIT_INT8:
  776. {
  777. int8_t value_signed = value;
  778. if (value_signed >= 0) {
  779. PrintInteger(buffer, value_signed);
  780. } else if (value_signed > -10){
  781. PrintInteger(buffer, -value_signed);
  782. buffer[0] = '-';
  783. } else {
  784. PrintInteger(buffer, -value_signed);
  785. buffer[2] = ' ';
  786. buffer[3] = '-';
  787. buffer[4] = buffer[0];
  788. buffer[5] = buffer[1];
  789. buffer[6] = '\0';
  790. }
  791. }
  792. break;
  793. case SETTING_UNIT_INDEX:
  794. PrintInteger(buffer, value + 1);
  795. break;
  796. case SETTING_UNIT_BAR_DURATION:
  797. if (value <= kMaxBarDuration) {
  798. PrintInteger(buffer, value);
  799. } else {
  800. strcpy(buffer, "oo");
  801. }
  802. break;
  803. case SETTING_UNIT_TEMPO:
  804. if (value == 39) {
  805. strcpy(buffer, "EXTERNAL");
  806. } else {
  807. PrintInteger(buffer, value);
  808. }
  809. break;
  810. case SETTING_UNIT_MIDI_CHANNEL:
  811. if (value == 0x10) {
  812. strcpy(buffer, "ALL");
  813. } else {
  814. PrintInteger(buffer, value + 1);
  815. }
  816. break;
  817. case SETTING_UNIT_MIDI_CHANNEL_OFF:
  818. if (value == 0x00) {
  819. strcpy(buffer, "OFF");
  820. } else {
  821. PrintInteger(buffer, value);
  822. }
  823. break;
  824. case SETTING_UNIT_VIBRATO_SPEED:
  825. if (value < 100) {
  826. PrintInteger(buffer, value);
  827. } else {
  828. strcpy(buffer, clock_division_values[value - 100]);
  829. }
  830. break;
  831. case SETTING_UNIT_PORTAMENTO:
  832. if (value <= 50) {
  833. PrintInteger(buffer, value);
  834. } else {
  835. PrintInteger(buffer, value - 51);
  836. }
  837. if (buffer[0] == ' ') {
  838. buffer[0] = (value <= 50) ? 'T' : 'R';
  839. }
  840. break;
  841. case SETTING_UNIT_ENUMERATION:
  842. strcpy(buffer, setting.values[value]);
  843. break;
  844. default:
  845. strcpy(buffer, "??");
  846. }
  847. }
  848. void Settings::Increment(const Setting& setting, int16_t increment) {
  849. int16_t value = Get(setting);
  850. if (setting.unit == SETTING_UNIT_INT8) {
  851. value = static_cast<int8_t>(value);
  852. }
  853. value += increment;
  854. if (value < setting.min_value) {
  855. value = setting.min_value;
  856. } else if (value > setting.max_value) {
  857. value = setting.max_value;
  858. }
  859. Set(setting, static_cast<uint8_t>(value));
  860. }
  861. /* static */
  862. void Settings::PrintInteger(char* buffer, uint8_t number) {
  863. buffer[1] = '0' + (number % 10);
  864. number /= 10;
  865. buffer[0] = number ? '0' + (number % 10) : ' ';
  866. number /= 10;
  867. buffer[2] = '\0';
  868. }
  869. /* extern */
  870. Settings settings;
  871. } // namespace yarns