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.

528 lines
19KB

  1. #pragma once
  2. #include <iostream>
  3. #include "dsp/digital.hpp"
  4. #include "AH.hpp"
  5. namespace rack_plugin_AmalgamatedHarmonics {
  6. struct AHPulseGenerator {
  7. float time = 0.f;
  8. float pulseTime = 0.f;
  9. bool ishigh() {
  10. return time < pulseTime;
  11. }
  12. bool process(float deltaTime) {
  13. time += deltaTime;
  14. return time < pulseTime;
  15. }
  16. bool trigger(float pulseTime) {
  17. // Keep the previous pulseTime if the existing pulse would be held longer than the currently requested one.
  18. if (time + pulseTime >= this->pulseTime) {
  19. time = 0.f;
  20. this->pulseTime = pulseTime;
  21. return true;
  22. } else {
  23. return false;
  24. }
  25. }
  26. };
  27. struct BpmCalculator {
  28. float timer = 0.0f;
  29. int misses = 0;
  30. float seconds = 0;
  31. SchmittTrigger gateTrigger;
  32. inline bool checkBeat(int mult) {
  33. return ( ((timer - mult * seconds) * (timer - mult * seconds) / (seconds * seconds) < 0.2f ) && misses < 4);
  34. }
  35. float calculateBPM(float delta, float input) {
  36. if (gateTrigger.process(input) ) {
  37. if (timer > 0) {
  38. float new_seconds;
  39. bool found = false;
  40. for(int mult = 1; !found && mult < 20; mult++ ) {
  41. if (checkBeat(mult)) {
  42. new_seconds = timer / mult;
  43. if (mult == 1) {
  44. misses = 0;
  45. } else {
  46. misses++;
  47. }
  48. found = true;
  49. };
  50. };
  51. if (!found) {
  52. // std::cerr << "default. misses = " << misses << "\n";
  53. new_seconds = timer;
  54. misses = 0;
  55. }
  56. float a = 0.5f; // params[SMOOTH_PARAM].value;
  57. seconds = ((1.0f - a) * seconds + a * new_seconds);
  58. timer -= seconds;
  59. }
  60. };
  61. timer += delta;
  62. if (seconds < 2.0e-05) {
  63. return 0.0f;
  64. } else {
  65. return 60.0f / seconds;
  66. }
  67. };
  68. };
  69. struct ChordDef {
  70. int number;
  71. std::string quality;
  72. int root[6];
  73. int first[6];
  74. int second[6];
  75. };
  76. struct Core {
  77. static constexpr float TRIGGER = 1e-3f;
  78. static constexpr float SEMITONE = 1.0f / 12.0f;
  79. // Reference, midi note to scale
  80. // 0 1
  81. // 1 b2 (#1)
  82. // 2 2
  83. // 3 b3 (#2)
  84. // 4 3
  85. // 5 4
  86. // 6 b5 (#4)
  87. // 7 5
  88. // 8 b6 (#5)
  89. // 9 6
  90. // 10 b7 (#6)
  91. // 11 7
  92. // http://www.grantmuller.com/MidiReference/doc/midiReference/ScaleReference.html
  93. // Although their definition of the Blues scale is wrong
  94. // Added the octave note to ensure that the last note is correctly processed
  95. int ASCALE_CHROMATIC [13]= {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12}; // All of the notes
  96. int ASCALE_IONIAN [8] = {0, 2, 4, 5, 7, 9, 11, 12}; // 1,2,3,4,5,6,7
  97. int ASCALE_DORIAN [8] = {0, 2, 3, 5, 7, 9, 10, 12}; // 1,2,b3,4,5,6,b7
  98. int ASCALE_PHRYGIAN [8] = {0, 1, 3, 5, 7, 8, 10, 12}; // 1,b2,b3,4,5,b6,b7
  99. int ASCALE_LYDIAN [8] = {0, 2, 4, 6, 7, 9, 10, 12}; // 1,2,3,#4,5,6,7
  100. int ASCALE_MIXOLYDIAN [8] = {0, 2, 4, 5, 7, 9, 10, 12}; // 1,2,3,4,5,6,b7
  101. int ASCALE_AEOLIAN [8] = {0, 2, 3, 5, 7, 8, 10, 12}; // 1,2,b3,4,5,b6,b7
  102. int ASCALE_LOCRIAN [8] = {0, 1, 3, 5, 6, 8, 10, 12}; // 1,b2,b3,4,b5,b6,b7
  103. int ASCALE_MAJOR_PENTA [6] = {0, 2, 4, 7, 9, 12}; // 1,2,3,5,6
  104. int ASCALE_MINOR_PENTA [6] = {0, 3, 5, 7, 10, 12}; // 1,b3,4,5,b7
  105. int ASCALE_HARMONIC_MINOR [8] = {0, 2, 3, 5, 7, 8, 11, 12}; // 1,2,b3,4,5,b6,7
  106. int ASCALE_BLUES [7] = {0, 3, 5, 6, 7, 10, 12}; // 1,b3,4,b5,5,b7
  107. enum Notes {
  108. NOTE_C = 0,
  109. NOTE_D_FLAT, // C Sharp
  110. NOTE_D,
  111. NOTE_E_FLAT, // D Sharp
  112. NOTE_E,
  113. NOTE_F,
  114. NOTE_G_FLAT, //F Sharp
  115. NOTE_G,
  116. NOTE_A_FLAT, // G Sharp
  117. NOTE_A,
  118. NOTE_B_FLAT, // A Sharp
  119. NOTE_B,
  120. NUM_NOTES
  121. };
  122. int CIRCLE_FIFTHS [12] = {
  123. NOTE_C,
  124. NOTE_G,
  125. NOTE_D,
  126. NOTE_A,
  127. NOTE_E,
  128. NOTE_B,
  129. NOTE_G_FLAT,
  130. NOTE_D_FLAT,
  131. NOTE_A_FLAT,
  132. NOTE_E_FLAT,
  133. NOTE_B_FLAT,
  134. NOTE_F
  135. };
  136. std::string noteNames[12] = {
  137. "C",
  138. "C#/Db",
  139. "D",
  140. "D#/Eb",
  141. "E",
  142. "F",
  143. "F#/Gb",
  144. "G",
  145. "G#/Ab",
  146. "A",
  147. "A#/Bb",
  148. "B",
  149. };
  150. enum Scales {
  151. SCALE_CHROMATIC = 0,
  152. SCALE_IONIAN,
  153. SCALE_DORIAN,
  154. SCALE_PHRYGIAN,
  155. SCALE_LYDIAN,
  156. SCALE_MIXOLYDIAN,
  157. SCALE_AEOLIAN,
  158. SCALE_LOCRIAN,
  159. SCALE_MAJOR_PENTA,
  160. SCALE_MINOR_PENTA,
  161. SCALE_HARMONIC_MINOR,
  162. SCALE_BLUES,
  163. NUM_SCALES
  164. };
  165. std::string scaleNames[12] = {
  166. "Chromatic",
  167. "Ionian (Major)",
  168. "Dorian",
  169. "Phrygian",
  170. "Lydian",
  171. "Mixolydian",
  172. "Aeolian (Natural Minor)",
  173. "Locrian",
  174. "Major Pentatonic",
  175. "Minor Pentatonic",
  176. "Harmonic Minor",
  177. "Blues"
  178. };
  179. std::string intervalNames[13] {
  180. "1",
  181. "b2",
  182. "2",
  183. "b3",
  184. "3",
  185. "4",
  186. "b5",
  187. "5",
  188. "b6",
  189. "6",
  190. "b7",
  191. "7",
  192. "O"
  193. };
  194. enum Modes {
  195. MODE_IONIAN = 0,
  196. MODE_DORIAN,
  197. MODE_PHRYGIAN,
  198. MODE_LYDIAN,
  199. MODE_MIXOLYDIAN,
  200. MODE_AEOLIAN,
  201. MODE_LOCRIAN,
  202. NUM_MODES
  203. };
  204. std::string modeNames[7] {
  205. "Ionian (M)",
  206. "Dorian",
  207. "Phrygian",
  208. "Lydian",
  209. "Mixolydian",
  210. "Aeolian (m)",
  211. "Locrian"
  212. };
  213. enum DEGREES {
  214. DEGREE_I = 0,
  215. DEGREE_II,
  216. DEGREE_III,
  217. DEGREE_IV,
  218. DEGREE_V,
  219. DEGREE_VI,
  220. DEGREE_VII,
  221. NUM_DEGREES
  222. };
  223. std::string degreeNames[21] { // Degree * 3 + Quality
  224. "I",
  225. "i",
  226. "i°",
  227. "II",
  228. "ii",
  229. "ii°",
  230. "III",
  231. "iii",
  232. "iii°",
  233. "IV",
  234. "iv",
  235. "iv°",
  236. "V",
  237. "v",
  238. "v°",
  239. "VI",
  240. "vi",
  241. "vi°",
  242. "VII",
  243. "vii",
  244. "vii°"
  245. };
  246. enum Inversion {
  247. ROOT,
  248. FIRST_INV,
  249. SECOND_INV,
  250. NUM_INV
  251. };
  252. std::string inversionNames[3] {
  253. "",
  254. "(1)",
  255. "(2)"
  256. };
  257. enum Quality {
  258. MAJ = 0,
  259. MIN,
  260. DIM,
  261. NUM_QUALITY
  262. };
  263. std::string qualityNames[3] {
  264. "Maj",
  265. "Min",
  266. "Dim"
  267. };
  268. double gaussrand();
  269. int ipow(int base, int exp);
  270. bool debug = false;
  271. int poll = 100000;
  272. int stepX = 0;
  273. /*
  274. * Convert a V/OCT voltage to a quantized pitch, key and scale, and calculate various information about the quantised note.
  275. */
  276. float getPitchFromVolts(float inVolts, int inRoot, int inScale, int *outNote, int *outDegree);
  277. float getPitchFromVolts(float inVolts, float inRoot, float inScale, int *outRoot, int *outScale, int *outNote, int *outDegree);
  278. /*
  279. * Convert a root note (relative to C, C=0) and positive semi-tone offset from that root to a voltage (1V/OCT, 0V = C4 (or 3??))
  280. */
  281. float getVoltsFromPitch(int inRoot, int inNote){
  282. return (inRoot + inNote) * SEMITONE;
  283. }
  284. float getVoltsFromScale(int scale) {
  285. return rescale(scale, 0.0f, NUM_SCALES - 1, 0.0f, 10.0f);
  286. }
  287. int getScaleFromVolts(float volts) {
  288. return round(rescale(fabs(volts), 0.0f, 10.0f, 0.0f, NUM_SCALES - 1));
  289. }
  290. int getModeFromVolts(float volts) {
  291. int mode = round(rescale(fabs(volts), 0.0f, 10.0f, 0.0f, NUM_SCALES - 1));
  292. return clamp(mode - 1, 0, 6);
  293. }
  294. float getVoltsFromMode(int mode) {
  295. // Mode 0 = IONIAN, MODE 6 = LOCRIAN -> Scale 1 - 7
  296. return rescale(mode + 1, 0.0f, NUM_SCALES - 1, 0.0f, 10.0f);
  297. }
  298. float getVoltsFromKey(int key) {
  299. return rescale(key, 0.0f, NUM_NOTES - 1, 0.0f, 10.0f);
  300. }
  301. int getKeyFromVolts(float volts) {
  302. return round(rescale(fabs(volts), 0.0f, 10.0f, 0.0f, NUM_NOTES - 1));
  303. }
  304. void getRootFromMode(int inMode, int inRoot, int inTonic, int *currRoot, int *quality);
  305. const static int NUM_CHORDS = 99;
  306. ChordDef ChordTable[NUM_CHORDS] {
  307. { 0 ,"None",{ -24 , -24 , -24 , -24 , -24 , -24 },{ -24 , -24 , -24 , -24 , -24 , -24 },{ -24 , -24 , -24 , -24 , -24 , -24 }},
  308. { 1 ,"",{ 0 , 4 , 7 , -24 , -20 , -17 },{ 12 , 4 , 7 , -12 , -20 , -17 },{ 12 , 16 , 7 , -12 , -8 , -17 }},
  309. { 2 ,"M#5",{ 0 , 4 , 8 , -24 , -20 , -16 },{ 12 , 4 , 8 , -12 , -20 , -16 },{ 12 , 16 , 8 , -12 , -8 , -16 }},
  310. { 3 ,"M#5add9",{ 0 , 4 , 8 , 14 , -24 , -20 },{ 12 , 4 , 8 , 14 , -24 , -20 },{ 12 , 16 , 8 , 14 , -12 , -20 }},
  311. { 4 ,"M13",{ 0 , 4 , 7 , 11 , 14 , 21 },{ 12 , 4 , 7 , 11 , 14 , 21 },{ 12 , 16 , 7 , 11 , 14 , 21 }},
  312. { 5 ,"M6",{ 0 , 4 , 7 , 21 , -24 , -20 },{ 12 , 4 , 7 , 21 , -24 , -20 },{ 12 , 16 , 7 , 21 , -12 , -20 }},
  313. { 6 ,"M6#11",{ 0 , 4 , 7 , 9 , 18 , -24 },{ 12 , 4 , 7 , 9 , 18 , -24 },{ 12 , 16 , 7 , 9 , 18 , -24 }},
  314. { 7 ,"M6/9",{ 0 , 4 , 7 , 9 , 14 , -24 },{ 12 , 4 , 7 , 9 , 14 , -24 },{ 12 , 16 , 7 , 9 , 14 , -24 }},
  315. { 8 ,"M6/9#11",{ 0 , 4 , 7 , 9 , 14 , 18 },{ 12 , 4 , 7 , 9 , 14 , 18 },{ 12 , 16 , 7 , 9 , 14 , 18 }},
  316. { 9 ,"M7#11",{ 0 , 4 , 7 , 11 , 18 , -24 },{ 12 , 4 , 7 , 11 , 18 , -24 },{ 12 , 16 , 7 , 11 , 18 , -24 }},
  317. { 10 ,"M7#5",{ 0 , 4 , 8 , 11 , -24 , -20 },{ 12 , 4 , 8 , 11 , -24 , -20 },{ 12 , 16 , 8 , 11 , -12 , -20 }},
  318. { 11 ,"M7#5sus4",{ 0 , 5 , 8 , 11 , -24 , -19 },{ 12 , 5 , 8 , 11 , -24 , -19 },{ 12 , 17 , 8 , 11 , -12 , -19 }},
  319. { 12 ,"M7#9#11",{ 0 , 4 , 7 , 11 , 15 , 18 },{ 12 , 4 , 7 , 11 , 15 , 18 },{ 12 , 16 , 7 , 11 , 15 , 18 }},
  320. { 13 ,"M7add13",{ 0 , 4 , 7 , 9 , 11 , 14 },{ 12 , 4 , 7 , 9 , 11 , 14 },{ 12 , 16 , 7 , 9 , 11 , 14 }},
  321. { 14 ,"M7b5",{ 0 , 4 , 6 , 11 , -24 , -20 },{ 12 , 4 , 6 , 11 , -24 , -20 },{ 12 , 16 , 6 , 11 , -12 , -20 }},
  322. { 15 ,"M7b6",{ 0 , 4 , 8 , 11 , -24 , -20 },{ 12 , 4 , 8 , 11 , -24 , -20 },{ 12 , 16 , 8 , 11 , -12 , -20 }},
  323. { 16 ,"M7b9",{ 0 , 4 , 7 , 11 , 13 , -20 },{ 12 , 4 , 7 , 11 , 13 , -20 },{ 12 , 16 , 7 , 11 , 13 , -20 }},
  324. { 17 ,"M7sus4",{ 0 , 5 , 7 , 11 , -24 , -19 },{ 12 , 5 , 7 , 11 , -24 , -19 },{ 12 , 17 , 7 , 11 , -12 , -19 }},
  325. { 18 ,"M9",{ 0 , 4 , 7 , 11 , 14 , -24 },{ 12 , 4 , 7 , 11 , 14 , -24 },{ 12 , 16 , 7 , 11 , 14 , -24 }},
  326. { 19 ,"M9#11",{ 0 , 4 , 7 , 11 , 14 , 18 },{ 12 , 4 , 7 , 11 , 14 , 18 },{ 12 , 16 , 7 , 11 , 14 , 18 }},
  327. { 20 ,"M9#5",{ 0 , 4 , 8 , 11 , 14 , -24 },{ 12 , 4 , 8 , 11 , 14 , -24 },{ 12 , 16 , 8 , 11 , 14 , -24 }},
  328. { 21 ,"M9#5sus4",{ 0 , 5 , 8 , 11 , 14 , -24 },{ 12 , 5 , 8 , 11 , 14 , -24 },{ 12 , 17 , 8 , 11 , 14 , -24 }},
  329. { 22 ,"M9b5",{ 0 , 4 , 6 , 11 , 14 , -24 },{ 12 , 4 , 6 , 11 , 14 , -24 },{ 12 , 16 , 6 , 11 , 14 , -24 }},
  330. { 23 ,"M9sus4",{ 0 , 5 , 7 , 11 , 14 , -24 },{ 12 , 5 , 7 , 11 , 14 , -24 },{ 12 , 17 , 7 , 11 , 14 , -24 }},
  331. { 24 ,"Madd9",{ 0 , 4 , 7 , 14 , -24 , -20 },{ 12 , 4 , 7 , 14 , -24 , -20 },{ 12 , 16 , 7 , 14 , -12 , -20 }},
  332. { 25 ,"Maj7",{ 0 , 4 , 7 , 11 , -24 , -20 },{ 12 , 4 , 7 , 11 , -24 , -20 },{ 12 , 16 , 7 , 11 , -12 , -20 }},
  333. { 26 ,"Mb5",{ 0 , 4 , 6 , -24 , -20 , -18 },{ 12 , 4 , 6 , -12 , -20 , -18 },{ 12 , 16 , 6 , -12 , -8 , -18 }},
  334. { 27 ,"Mb6",{ 0 , 4 , 20 , -24 , -20 , -4 },{ 12 , 4 , 20 , -12 , -20 , -4 },{ 12 , 16 , 20 , -12 , -8 , -4 }},
  335. { 28 ,"Msus2",{ 0 , 2 , 7 , -24 , -22 , -17 },{ 12 , 2 , 7 , -12 , -22 , -17 },{ 12 , 14 , 7 , -12 , -10 , -17 }},
  336. { 29 ,"Msus4",{ 0 , 5 , 7 , -24 , -19 , -17 },{ 12 , 5 , 7 , -12 , -19 , -17 },{ 12 , 17 , 7 , -12 , -7 , -17 }},
  337. { 30 ,"Maddb9",{ 0 , 4 , 7 , 13 , -24 , -20 },{ 12 , 4 , 7 , 13 , -24 , -20 },{ 12 , 16 , 7 , 13 , -12 , -20 }},
  338. { 31 ,"7",{ 0 , 4 , 7 , 10 , -24 , -20 },{ 12 , 4 , 7 , 10 , -24 , -20 },{ 12 , 16 , 7 , 10 , -12 , -20 }},
  339. { 32 ,"9",{ 0 , 4 , 7 , 10 , 14 , -24 },{ 12 , 4 , 7 , 10 , 14 , -24 },{ 12 , 16 , 7 , 10 , 14 , -24 }},
  340. { 33 ,"11",{ 0 , 7 , 10 , 14 , 17 , -24 },{ 12 , 7 , 10 , 14 , 17 , -24 },{ 12 , 19 , 10 , 14 , 17 , -24 }},
  341. { 34 ,"13",{ 0 , 4 , 7 , 10 , 14 , 21 },{ 12 , 4 , 7 , 10 , 14 , 21 },{ 12 , 16 , 7 , 10 , 14 , 21 }},
  342. { 35 ,"11b9",{ 0 , 7 , 10 , 13 , 17 , -24 },{ 12 , 7 , 10 , 13 , 17 , -24 },{ 12 , 19 , 10 , 13 , 17 , -24 }},
  343. { 36 ,"13#9",{ 0 , 4 , 7 , 10 , 15 , 21 },{ 12 , 4 , 7 , 10 , 15 , 21 },{ 12 , 16 , 7 , 10 , 15 , 21 }},
  344. { 37 ,"13b5",{ 0 , 4 , 6 , 9 , 10 , 14 },{ 12 , 4 , 6 , 9 , 10 , 14 },{ 12 , 16 , 6 , 9 , 10 , 14 }},
  345. { 38 ,"13b9",{ 0 , 4 , 7 , 10 , 13 , 21 },{ 12 , 4 , 7 , 10 , 13 , 21 },{ 12 , 16 , 7 , 10 , 13 , 21 }},
  346. { 39 ,"13no5",{ 0 , 4 , 10 , 14 , 21 , -24 },{ 12 , 4 , 10 , 14 , 21 , -24 },{ 12 , 16 , 10 , 14 , 21 , -24 }},
  347. { 40 ,"13sus4",{ 0 , 5 , 7 , 10 , 14 , 21 },{ 12 , 5 , 7 , 10 , 14 , 21 },{ 12 , 17 , 7 , 10 , 14 , 21 }},
  348. { 41 ,"69#11",{ 0 , 4 , 7 , 9 , 14 , 18 },{ 12 , 4 , 7 , 9 , 14 , 18 },{ 12 , 16 , 7 , 9 , 14 , 18 }},
  349. { 42 ,"7#11",{ 0 , 4 , 7 , 10 , 18 , -24 },{ 12 , 4 , 7 , 10 , 18 , -24 },{ 12 , 16 , 7 , 10 , 18 , -24 }},
  350. { 43 ,"7#11b13",{ 0 , 4 , 7 , 10 , 18 , 20 },{ 12 , 4 , 7 , 10 , 18 , 20 },{ 12 , 16 , 7 , 10 , 18 , 20 }},
  351. { 44 ,"7#5",{ 0 , 4 , 8 , 10 , -24 , -20 },{ 12 , 4 , 8 , 10 , -24 , -20 },{ 12 , 16 , 8 , 10 , -12 , -20 }},
  352. { 45 ,"7#5#9",{ 0 , 4 , 8 , 10 , 15 , -24 },{ 12 , 4 , 8 , 10 , 15 , -24 },{ 12 , 16 , 8 , 10 , 15 , -24 }},
  353. { 46 ,"7#5b9",{ 0 , 4 , 8 , 10 , 13 , -24 },{ 12 , 4 , 8 , 10 , 13 , -24 },{ 12 , 16 , 8 , 10 , 13 , -24 }},
  354. { 47 ,"7#5b9#11",{ 0 , 4 , 8 , 10 , 13 , 18 },{ 12 , 4 , 8 , 10 , 13 , 18 },{ 12 , 16 , 8 , 10 , 13 , 18 }},
  355. { 48 ,"7#5sus4",{ 0 , 5 , 8 , 10 , -24 , -19 },{ 12 , 5 , 8 , 10 , -24 , -19 },{ 12 , 17 , 8 , 10 , -12 , -19 }},
  356. { 49 ,"7#9",{ 0 , 4 , 7 , 10 , 15 , -24 },{ 12 , 4 , 7 , 10 , 15 , -24 },{ 12 , 16 , 7 , 10 , 15 , -24 }},
  357. { 50 ,"7#9#11",{ 0 , 4 , 7 , 10 , 15 , 18 },{ 12 , 4 , 7 , 10 , 15 , 18 },{ 12 , 16 , 7 , 10 , 15 , 18 }},
  358. { 51 ,"7#9b13",{ 0 , 4 , 7 , 10 , 15 , 20 },{ 12 , 4 , 7 , 10 , 15 , 20 },{ 12 , 16 , 7 , 10 , 15 , 20 }},
  359. { 52 ,"7add6",{ 0 , 4 , 7 , 10 , 21 , -24 },{ 12 , 4 , 7 , 10 , 21 , -24 },{ 12 , 16 , 7 , 10 , 21 , -24 }},
  360. { 53 ,"7b13",{ 0 , 4 , 10 , 20 , -24 , -20 },{ 12 , 4 , 10 , 20 , -24 , -20 },{ 12 , 16 , 10 , 20 , -12 , -20 }},
  361. { 54 ,"7b5",{ 0 , 4 , 6 , 10 , -24 , -20 },{ 12 , 4 , 6 , 10 , -24 , -20 },{ 12 , 16 , 6 , 10 , -12 , -20 }},
  362. { 55 ,"7b6",{ 0 , 4 , 7 , 8 , 10 , -24 },{ 12 , 4 , 7 , 8 , 10 , -24 },{ 12 , 16 , 7 , 8 , 10 , -24 }},
  363. { 56 ,"7b9",{ 0 , 4 , 7 , 10 , 13 , -24 },{ 12 , 4 , 7 , 10 , 13 , -24 },{ 12 , 16 , 7 , 10 , 13 , -24 }},
  364. { 57 ,"7b9#11",{ 0 , 4 , 7 , 10 , 13 , 18 },{ 12 , 4 , 7 , 10 , 13 , 18 },{ 12 , 16 , 7 , 10 , 13 , 18 }},
  365. { 58 ,"7b9#9",{ 0 , 4 , 7 , 10 , 13 , 15 },{ 12 , 4 , 7 , 10 , 13 , 15 },{ 12 , 16 , 7 , 10 , 13 , 15 }},
  366. { 59 ,"7b9b13",{ 0 , 4 , 7 , 10 , 13 , 20 },{ 12 , 4 , 7 , 10 , 13 , 20 },{ 12 , 16 , 7 , 10 , 13 , 20 }},
  367. { 60 ,"7no5",{ 0 , 4 , 10 , -24 , -20 , -14 },{ 12 , 4 , 10 , -12 , -20 , -14 },{ 12 , 16 , 10 , -12 , -8 , -14 }},
  368. { 61 ,"7sus4",{ 0 , 5 , 7 , 10 , -24 , -19 },{ 12 , 5 , 7 , 10 , -24 , -19 },{ 12 , 17 , 7 , 10 , -12 , -19 }},
  369. { 62 ,"7sus4b9",{ 0 , 5 , 7 , 10 , 13 , -24 },{ 12 , 5 , 7 , 10 , 13 , -24 },{ 12 , 17 , 7 , 10 , 13 , -24 }},
  370. { 63 ,"7sus4b9b13",{ 0 , 5 , 7 , 10 , 13 , 20 },{ 12 , 5 , 7 , 10 , 13 , 20 },{ 12 , 17 , 7 , 10 , 13 , 20 }},
  371. { 64 ,"9#11",{ 0 , 4 , 7 , 10 , 14 , 18 },{ 12 , 4 , 7 , 10 , 14 , 18 },{ 12 , 16 , 7 , 10 , 14 , 18 }},
  372. { 65 ,"9#5",{ 0 , 4 , 8 , 10 , 14 , -24 },{ 12 , 4 , 8 , 10 , 14 , -24 },{ 12 , 16 , 8 , 10 , 14 , -24 }},
  373. { 66 ,"9#5#11",{ 0 , 4 , 8 , 10 , 14 , 18 },{ 12 , 4 , 8 , 10 , 14 , 18 },{ 12 , 16 , 8 , 10 , 14 , 18 }},
  374. { 67 ,"9b13",{ 0 , 4 , 10 , 14 , 20 , -24 },{ 12 , 4 , 10 , 14 , 20 , -24 },{ 12 , 16 , 10 , 14 , 20 , -24 }},
  375. { 68 ,"9b5",{ 0 , 4 , 6 , 10 , 14 , -24 },{ 12 , 4 , 6 , 10 , 14 , -24 },{ 12 , 16 , 6 , 10 , 14 , -24 }},
  376. { 69 ,"9no5",{ 0 , 4 , 10 , 14 , -24 , -20 },{ 12 , 4 , 10 , 14 , -24 , -20 },{ 12 , 16 , 10 , 14 , -12 , -20 }},
  377. { 70 ,"9sus4",{ 0 , 5 , 7 , 10 , 14 , -24 },{ 12 , 5 , 7 , 10 , 14 , -24 },{ 12 , 17 , 7 , 10 , 14 , -24 }},
  378. { 71 ,"m",{ 0 , 3 , 7 , -24 , -21 , -17 },{ 12 , 3 , 7 , -12 , -21 , -17 },{ 12 , 15 , 7 , -12 , -9 , -17 }},
  379. { 72 ,"m#5",{ 0 , 3 , 8 , -24 , -21 , -16 },{ 12 , 3 , 8 , -12 , -21 , -16 },{ 12 , 15 , 8 , -12 , -9 , -16 }},
  380. { 73 ,"m11",{ 0 , 3 , 7 , 10 , 14 , 17 },{ 12 , 3 , 7 , 10 , 14 , 17 },{ 12 , 15 , 7 , 10 , 14 , 17 }},
  381. { 74 ,"m11A5",{ 0 , 3 , 8 , 10 , 14 , 17 },{ 12 , 3 , 8 , 10 , 14 , 17 },{ 12 , 15 , 8 , 10 , 14 , 17 }},
  382. { 75 ,"m11b5",{ 0 , 3 , 10 , 14 , 17 , 18 },{ 12 , 3 , 10 , 14 , 17 , 18 },{ 12 , 15 , 10 , 14 , 17 , 18 }},
  383. { 76 ,"m6",{ 0 , 3 , 5 , 7 , 21 , -24 },{ 12 , 3 , 5 , 7 , 21 , -24 },{ 12 , 15 , 5 , 7 , 21 , -24 }},
  384. { 77 ,"m69",{ 0 , 3 , 7 , 9 , 14 , -24 },{ 12 , 3 , 7 , 9 , 14 , -24 },{ 12 , 15 , 7 , 9 , 14 , -24 }},
  385. { 78 ,"m7",{ 0 , 3 , 7 , 10 , -24 , -21 },{ 12 , 3 , 7 , 10 , -24 , -21 },{ 12 , 15 , 7 , 10 , -12 , -21 }},
  386. { 79 ,"m7#5",{ 0 , 3 , 8 , 10 , -24 , -21 },{ 12 , 3 , 8 , 10 , -24 , -21 },{ 12 , 15 , 8 , 10 , -12 , -21 }},
  387. { 80 ,"m7add11",{ 0 , 3 , 7 , 10 , 17 , -24 },{ 12 , 3 , 7 , 10 , 17 , -24 },{ 12 , 15 , 7 , 10 , 17 , -24 }},
  388. { 81 ,"m7b5",{ 0 , 3 , 6 , 10 , -24 , -21 },{ 12 , 3 , 6 , 10 , -24 , -21 },{ 12 , 15 , 6 , 10 , -12 , -21 }},
  389. { 82 ,"m9",{ 0 , 3 , 7 , 10 , 14 , -24 },{ 12 , 3 , 7 , 10 , 14 , -24 },{ 12 , 15 , 7 , 10 , 14 , -24 }},
  390. { 83 ,"#5",{ 0 , 3 , 8 , 10 , 14 , -24 },{ 12 , 3 , 8 , 10 , 14 , -24 },{ 12 , 15 , 8 , 10 , 14 , -24 }},
  391. { 84 ,"m9b5",{ 0 , 3 , 10 , 14 , 18 , -24 },{ 12 , 3 , 10 , 14 , 18 , -24 },{ 12 , 15 , 10 , 14 , 18 , -24 }},
  392. { 85 ,"mMaj7",{ 0 , 3 , 7 , 11 , -24 , -21 },{ 12 , 3 , 7 , 11 , -24 , -21 },{ 12 , 15 , 7 , 11 , -12 , -21 }},
  393. { 86 ,"mMaj7b6",{ 0 , 3 , 7 , 8 , 11 , -24 },{ 12 , 3 , 7 , 8 , 11 , -24 },{ 12 , 15 , 7 , 8 , 11 , -24 }},
  394. { 87 ,"mM9",{ 0 , 3 , 7 , 11 , 14 , -24 },{ 12 , 3 , 7 , 11 , 14 , -24 },{ 12 , 15 , 7 , 11 , 14 , -24 }},
  395. { 88 ,"mM9b6",{ 0 , 3 , 7 , 8 , 11 , 14 },{ 12 , 3 , 7 , 8 , 11 , 14 },{ 12 , 15 , 7 , 8 , 11 , 14 }},
  396. { 89 ,"mb6M7",{ 0 , 3 , 8 , 11 , -24 , -21 },{ 12 , 3 , 8 , 11 , -24 , -21 },{ 12 , 15 , 8 , 11 , -12 , -21 }},
  397. { 90 ,"mb6b9",{ 0 , 3 , 8 , 13 , -24 , -21 },{ 12 , 3 , 8 , 13 , -24 , -21 },{ 12 , 15 , 8 , 13 , -12 , -21 }},
  398. { 91 ,"dim",{ 0 , 3 , 6 , -24 , -21 , -18 },{ 12 , 3 , 6 , -12 , -21 , -18 },{ 12 , 15 , 6 , -12 , -9 , -18 }},
  399. { 92 ,"dim7",{ 0 , 3 , 6 , 21 , -24 , -21 },{ 12 , 3 , 6 , 21 , -24 , -21 },{ 12 , 15 , 6 , 21 , -12 , -21 }},
  400. { 93 ,"dim7M7",{ 0 , 3 , 6 , 9 , 11 , -24 },{ 12 , 3 , 6 , 9 , 11 , -24 },{ 12 , 15 , 6 , 9 , 11 , -24 }},
  401. { 94 ,"dimM7",{ 0 , 3 , 6 , 11 , -24 , -21 },{ 12 , 3 , 6 , 11 , -24 , -21 },{ 12 , 15 , 6 , 11 , -12 , -21 }},
  402. { 95 ,"sus24",{ 0 , 2 , 5 , 7 , -24 , -22 },{ 12 , 2 , 5 , 7 , -24 , -22 },{ 12 , 14 , 5 , 7 , -12 , -22 }},
  403. { 96 ,"augadd#9",{ 0 , 4 , 8 , 15 , -24 , -20 },{ 12 , 4 , 8 , 15 , -24 , -20 },{ 12 , 16 , 8 , 15 , -12 , -20 }},
  404. { 97 ,"madd4",{ 0 , 3 , 5 , 7 , -24 , -21 },{ 12 , 3 , 5 , 7 , -24 , -21 },{ 12 , 15 , 5 , 7 , -12 , -21 }},
  405. { 98 ,"madd9",{ 0 , 3 , 7 , 14 , -24 , -21 },{ 12 , 3 , 7 , 14 , -24 , -21 },{ 12 , 15 , 7 , 14 , -12 , -21 }},
  406. };
  407. int ModeQuality[7][7] {
  408. {MAJ,MIN,MIN,MAJ,MAJ,MIN,DIM}, // Ionian
  409. {MIN,MIN,MAJ,MAJ,MIN,DIM,MAJ}, // Dorian
  410. {MIN,MAJ,MAJ,MIN,DIM,MAJ,MIN}, // Phrygian
  411. {MAJ,MAJ,MIN,DIM,MAJ,MIN,MIN}, // Lydian
  412. {MAJ,MIN,DIM,MAJ,MIN,MIN,MAJ}, // Mixolydian
  413. {MIN,DIM,MAJ,MIN,MIN,MAJ,MAJ}, // Aeolian
  414. {DIM,MAJ,MIN,MIN,MAJ,MAJ,MIN} // Locrian
  415. };
  416. int ModeOffset[7][7] {
  417. {0,0,0,0,0,0,0}, // Ionian
  418. {0,0,-1,-1,0,0,-1}, // Dorian
  419. {0,-1,-1,0,0,-1,-1}, // Phrygian
  420. {0,0,0,1,0,0,0}, // Lydian
  421. {0,0,0,0,0,0,-1}, // Mixolydian
  422. {0,0,-1,0,0,-1,-1}, // Aeolian
  423. {0,-1,-1,0,-1,-1,-1} // Locrian
  424. };
  425. // NOTE_C = 0,
  426. // NOTE_D_FLAT, // C Sharp
  427. // NOTE_D,
  428. // NOTE_E_FLAT, // D Sharp
  429. // NOTE_E,
  430. // NOTE_F,
  431. // NOTE_G_FLAT, //F Sharp
  432. // NOTE_G,
  433. // NOTE_A_FLAT, // G Sharp
  434. // NOTE_A,
  435. // NOTE_B_FLAT, // A Sharp
  436. // NOTE_B,
  437. //0 1 2 3 4 5 6 7 8 9 10 11 12
  438. int tonicIndex[13] {1, 3, 5, 0, 2, 4, 6, 1, 3, 5, 0, 2, 4};
  439. int scaleIndex[7] {5, 3, 1, 6, 4, 2, 0};
  440. int noteIndex[13] {
  441. NOTE_G_FLAT,
  442. NOTE_D_FLAT,
  443. NOTE_A_FLAT,
  444. NOTE_E_FLAT,
  445. NOTE_B_FLAT,
  446. NOTE_F,
  447. NOTE_C,
  448. NOTE_G,
  449. NOTE_D,
  450. NOTE_A,
  451. NOTE_E,
  452. NOTE_B,
  453. NOTE_G_FLAT};
  454. };
  455. Core & CoreUtil();
  456. } // namespace rack_plugin_AmalgamatedHarmonics