gm.js 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  1. /*
  2. ----------------------------------------------------------
  3. GeneralMIDI
  4. ----------------------------------------------------------
  5. */
  6. (function(root) { 'use strict';
  7. root.GM = (function(arr) {
  8. var clean = function(name) {
  9. return name.replace(/[^a-z0-9 ]/gi, '').replace(/[ ]/g, '_').toLowerCase();
  10. };
  11. var res = {
  12. byName: { },
  13. byId: { },
  14. byCategory: { }
  15. };
  16. for (var key in arr) {
  17. var list = arr[key];
  18. for (var n = 0, length = list.length; n < length; n++) {
  19. var instrument = list[n];
  20. if (!instrument) continue;
  21. var num = parseInt(instrument.substr(0, instrument.indexOf(' ')), 10);
  22. instrument = instrument.replace(num + ' ', '');
  23. res.byId[--num] =
  24. res.byName[clean(instrument)] =
  25. res.byCategory[clean(key)] = {
  26. id: clean(instrument),
  27. instrument: instrument,
  28. number: num,
  29. category: key
  30. };
  31. }
  32. }
  33. return res;
  34. })({
  35. 'Piano': ['1 Acoustic Grand Piano', '2 Bright Acoustic Piano', '3 Electric Grand Piano', '4 Honky-tonk Piano', '5 Electric Piano 1', '6 Electric Piano 2', '7 Harpsichord', '8 Clavinet'],
  36. 'Chromatic Percussion': ['9 Celesta', '10 Glockenspiel', '11 Music Box', '12 Vibraphone', '13 Marimba', '14 Xylophone', '15 Tubular Bells', '16 Dulcimer'],
  37. 'Organ': ['17 Drawbar Organ', '18 Percussive Organ', '19 Rock Organ', '20 Church Organ', '21 Reed Organ', '22 Accordion', '23 Harmonica', '24 Tango Accordion'],
  38. 'Guitar': ['25 Acoustic Guitar (nylon)', '26 Acoustic Guitar (steel)', '27 Electric Guitar (jazz)', '28 Electric Guitar (clean)', '29 Electric Guitar (muted)', '30 Overdriven Guitar', '31 Distortion Guitar', '32 Guitar Harmonics'],
  39. 'Bass': ['33 Acoustic Bass', '34 Electric Bass (finger)', '35 Electric Bass (pick)', '36 Fretless Bass', '37 Slap Bass 1', '38 Slap Bass 2', '39 Synth Bass 1', '40 Synth Bass 2'],
  40. 'Strings': ['41 Violin', '42 Viola', '43 Cello', '44 Contrabass', '45 Tremolo Strings', '46 Pizzicato Strings', '47 Orchestral Harp', '48 Timpani'],
  41. 'Ensemble': ['49 String Ensemble 1', '50 String Ensemble 2', '51 Synth Strings 1', '52 Synth Strings 2', '53 Choir Aahs', '54 Voice Oohs', '55 Synth Choir', '56 Orchestra Hit'],
  42. 'Brass': ['57 Trumpet', '58 Trombone', '59 Tuba', '60 Muted Trumpet', '61 French Horn', '62 Brass Section', '63 Synth Brass 1', '64 Synth Brass 2'],
  43. 'Reed': ['65 Soprano Sax', '66 Alto Sax', '67 Tenor Sax', '68 Baritone Sax', '69 Oboe', '70 English Horn', '71 Bassoon', '72 Clarinet'],
  44. 'Pipe': ['73 Piccolo', '74 Flute', '75 Recorder', '76 Pan Flute', '77 Blown Bottle', '78 Shakuhachi', '79 Whistle', '80 Ocarina'],
  45. 'Synth Lead': ['81 Lead 1 (square)', '82 Lead 2 (sawtooth)', '83 Lead 3 (calliope)', '84 Lead 4 (chiff)', '85 Lead 5 (charang)', '86 Lead 6 (voice)', '87 Lead 7 (fifths)', '88 Lead 8 (bass + lead)'],
  46. 'Synth Pad': ['89 Pad 1 (new age)', '90 Pad 2 (warm)', '91 Pad 3 (polysynth)', '92 Pad 4 (choir)', '93 Pad 5 (bowed)', '94 Pad 6 (metallic)', '95 Pad 7 (halo)', '96 Pad 8 (sweep)'],
  47. 'Synth Effects': ['97 FX 1 (rain)', '98 FX 2 (soundtrack)', '99 FX 3 (crystal)', '100 FX 4 (atmosphere)', '101 FX 5 (brightness)', '102 FX 6 (goblins)', '103 FX 7 (echoes)', '104 FX 8 (sci-fi)'],
  48. 'Ethnic': ['105 Sitar', '106 Banjo', '107 Shamisen', '108 Koto', '109 Kalimba', '110 Bagpipe', '111 Fiddle', '112 Shanai'],
  49. 'Percussive': ['113 Tinkle Bell', '114 Agogo', '115 Steel Drums', '116 Woodblock', '117 Taiko Drum', '118 Melodic Tom', '119 Synth Drum'],
  50. 'Sound effects': ['120 Reverse Cymbal', '121 Guitar Fret Noise', '122 Breath Noise', '123 Seashore', '124 Bird Tweet', '125 Telephone Ring', '126 Helicopter', '127 Applause', '128 Gunshot']
  51. });
  52. /* get/setInstrument
  53. --------------------------------------------------- */
  54. root.getInstrument = function(channelId) {
  55. var channel = root.channels[channelId];
  56. return channel && channel.instrument;
  57. };
  58. root.setInstrument = function(channelId, program, delay) {
  59. var channel = root.channels[channelId];
  60. if (delay) {
  61. return setTimeout(function() {
  62. channel.instrument = program;
  63. }, delay);
  64. } else {
  65. channel.instrument = program;
  66. }
  67. };
  68. /* get/setMono
  69. --------------------------------------------------- */
  70. root.getMono = function(channelId) {
  71. var channel = root.channels[channelId];
  72. return channel && channel.mono;
  73. };
  74. root.setMono = function(channelId, truthy, delay) {
  75. var channel = root.channels[channelId];
  76. if (delay) {
  77. return setTimeout(function() {
  78. channel.mono = truthy;
  79. }, delay);
  80. } else {
  81. channel.mono = truthy;
  82. }
  83. };
  84. /* get/setOmni
  85. --------------------------------------------------- */
  86. root.getOmni = function(channelId) {
  87. var channel = root.channels[channelId];
  88. return channel && channel.omni;
  89. };
  90. root.setOmni = function(channelId, truthy) {
  91. var channel = root.channels[channelId];
  92. if (delay) {
  93. return setTimeout(function() {
  94. channel.omni = truthy;
  95. }, delay);
  96. } else {
  97. channel.omni = truthy;
  98. }
  99. };
  100. /* get/setSolo
  101. --------------------------------------------------- */
  102. root.getSolo = function(channelId) {
  103. var channel = root.channels[channelId];
  104. return channel && channel.solo;
  105. };
  106. root.setSolo = function(channelId, truthy) {
  107. var channel = root.channels[channelId];
  108. if (delay) {
  109. return setTimeout(function() {
  110. channel.solo = truthy;
  111. }, delay);
  112. } else {
  113. channel.solo = truthy;
  114. }
  115. };
  116. /* channels
  117. --------------------------------------------------- */
  118. root.channels = (function() { // 0 - 15 channels
  119. var channels = {};
  120. for (var i = 0; i < 16; i++) {
  121. channels[i] = { // default values
  122. instrument: i,
  123. pitchBend: 0,
  124. mute: false,
  125. mono: false,
  126. omni: false,
  127. solo: false
  128. };
  129. }
  130. return channels;
  131. })();
  132. /* note conversions
  133. --------------------------------------------------- */
  134. root.keyToNote = {}; // C8 == 108
  135. root.noteToKey = {}; // 108 == C8
  136. (function() {
  137. var A0 = 0x15; // first note
  138. var C8 = 0x6C; // last note
  139. var number2key = ['C', 'Db', 'D', 'Eb', 'E', 'F', 'Gb', 'G', 'Ab', 'A', 'Bb', 'B'];
  140. for (var n = A0; n <= C8; n++) {
  141. var octave = (n - 12) / 12 >> 0;
  142. var name = number2key[n % 12] + octave;
  143. root.keyToNote[name] = n;
  144. root.noteToKey[n] = name;
  145. }
  146. })();
  147. })(MIDI);