PageRenderTime 25ms CodeModel.GetById 31ms RepoModel.GetById 1ms app.codeStats 0ms

/src/js/libs/Sorollet-legacy.js

https://github.com/ehsan/to_the_beat
JavaScript | 199 lines | 104 code | 43 blank | 52 comment | 6 complexity | 3a5e43e3d3124ee06b97c92b30486967 MD5 | raw file
  1. // Something to be able to use old (~2008) data with recent Sorollet versions
  2. SOROLLET.Legacy = {};
  3. SOROLLET.Legacy.loadSongFromArray = function(player, song) {
  4. var i = 0, j,
  5. size = song.length,
  6. voice,
  7. M_PI_2 = Math.PI / 2.0;
  8. player.voices = [];
  9. player.patterns = [];
  10. player.orderList = [];
  11. while(i < size) { // -1?
  12. // bpm, speed, num channels
  13. player.setBPM(song[i]); i++;
  14. // legacy // player.setSpeed(song[i]);
  15. i++;
  16. var numVoices = song[i]; i++;
  17. // legacy
  18. //sorollet_song.frames_per_second = sorollet_song.bpm * 0.4f;
  19. //sorollet_song.seconds_per_row = sorollet_song.speed / sorollet_song.frames_per_second;
  20. // Init voices
  21. for(j = 0; j < numVoices; j++) {
  22. voice = new SOROLLET.Voice();
  23. player.voices.push( voice );
  24. }
  25. // Order list
  26. var numOrders = song[i]; i++;
  27. for(j = 0; j < numOrders; j++) {
  28. player.orderList.push(song[i]); i++;
  29. }
  30. // Patterns
  31. var numPatterns = song[i]; i++;
  32. for(j = 0; j < numPatterns; j++) {
  33. var numRows = song[i]; i++;
  34. var pattern = new SOROLLET.Pattern(numVoices, numRows);
  35. for(var row = 0; row < numRows; row++) {
  36. for(var col = 0; col < numVoices; col++) {
  37. var cell = pattern.getCell(row, col);
  38. cell.note = song[i]; i++;
  39. cell.volume = charToFloat(song[i], 0.0, 1.0); i++;
  40. }
  41. }
  42. player.patterns.push(pattern);
  43. }
  44. // Synths config
  45. for(j = 0; j < numVoices; j++) {
  46. voice = player.voices[j];
  47. var oscillatorMix = charToFloat(song[i], 0.0, 1.0); i++; // TODO to wave1Volume, wave2Volume
  48. voice.currentVolume = charToFloat(song[i], 0.0, 1.0); i++;
  49. // Osc1
  50. voice.wave1Function = enumToWave(song[i]); i++;
  51. voice.wave1Phase = charToFloat(song[i], -M_PI_2, M_PI_2); i++;
  52. voice.wave1Octave = song[i]; i++;
  53. // Osc2
  54. voice.wave2Function = enumToWave(song[i]); i++;
  55. voice.wave2Phase = charToFloat(song[i], -M_PI_2, M_PI_2); i++;
  56. voice.wave2Octave = song[i]; i++;
  57. // Noise level
  58. voice.noiseAmount = charToFloat(song[i], 0.0, 1.0); i++;
  59. // Begins section of "massively not implemented features"
  60. // Filter
  61. // type
  62. // sorollet_synths[j].filter_type = song[i]; i++;
  63. i++;
  64. // frequency
  65. // sorollet_synths[j].filter_frequency = charToFloat(song[i], 22.0f, 300.0);
  66. i++;
  67. // resonance
  68. // sorollet_synths[j].filter_resonance = charToFloat(song[i], 0.0, 0.2f);
  69. i++;
  70. // Saturate
  71. // sorollet_synths[j].saturate_active = song[i];
  72. i++;
  73. //sorollet_synths[j].saturate_max = charToFloat(song[i], 0.0, 1.0);
  74. i++;
  75. // EQ
  76. // sorollet_synths[j].eq_active = song[i];
  77. i++;
  78. // sorollet_synths[j].eq_state.lg = charToFloat(song[i], 0.0, 10.0);
  79. i++;
  80. // sorollet_synths[j].eq_state.mg = charToFloat(song[i], 0.0, 10.0);
  81. i++;
  82. // sorollet_synths[j].eq_state.hg = charToFloat(song[i], 0.0, 10.0);
  83. i++;
  84. // Bass boost
  85. // sorollet_synths[j].bass_boost_active = song[i];
  86. i++;
  87. // sorollet_synths[j].bass_boost_multiplier = charToFloat(song[i], 0.0, 8.0f);
  88. i++;
  89. // Envelopes
  90. var attack_time;
  91. var decay_time;
  92. var sustain_level;
  93. var release_time;
  94. var env;
  95. // Amp envelope
  96. // sorollet_synths[j].amp_envelope_active = song[i];
  97. i++;
  98. attack_time = charToFloat(song[i], 0.0, 16.0); i++;
  99. decay_time = charToFloat(song[i], 0.0, 16.0); i++;
  100. sustain_level = charToFloat(song[i], 0.0, 1.0); i++;
  101. release_time = charToFloat(song[i], 0.0, 16.0); i++;
  102. // sorollet_adsr_set_values(&sorollet_synths[j].amp_envelope, attack_time, decay_time, sustain_level, release_time);
  103. env = voice.volumeEnvelope;
  104. env.setAttack(attack_time);
  105. env.setDecay(decay_time);
  106. env.setSustainLevel(sustain_level);
  107. env.setRelease(release_time);
  108. // Pitch envelope
  109. // sorollet_synths[j].pitch_envelope_active = song[i];
  110. i++;
  111. attack_time = charToFloat(song[i], 0.0, 16.0); i++;
  112. decay_time = charToFloat(song[i], 0.0, 16.0); i++;
  113. sustain_level = charToFloat(song[i], 0.0, 1.0); i++;
  114. release_time = charToFloat(song[i], 0.0, 16.0); i++;
  115. //sorollet_adsr_set_values(&sorollet_synths[j].pitch_envelope, attack_time, decay_time, sustain_level, release_time);
  116. env = voice.pitchEnvelope;
  117. env.setAttack(attack_time);
  118. env.setDecay(decay_time);
  119. env.setSustainLevel(sustain_level);
  120. env.setRelease(release_time);
  121. // Filter frequency envelope
  122. // TODO not implemented
  123. // sorollet_synths[j].filter_freq_envelope_active = song[i];
  124. i++;
  125. // attack_time = charToFloat(song[i], 0.0, 16.0);
  126. i++;
  127. // decay_time = charToFloat(song[i], 0.0, 16.0);
  128. i++;
  129. // sustain_level = charToFloat(song[i], 0.0, 1.0);
  130. i++;
  131. // release_time = charToFloat(song[i], 0.0, 16.0);
  132. i++;
  133. //sorollet_adsr_set_values(&sorollet_synths[j].filter_freq_envelope, attack_time, decay_time, sustain_level, release_time);
  134. // Precalc filter parameters if the envelope is not used
  135. /*if(!sorollet_synths[j].filter_freq_envelope_active)
  136. {
  137. sorollet_synth_prepare_filter(&sorollet_synths[j], sorollet_synths[j].filter_frequency);
  138. }*/
  139. }
  140. return 0;
  141. }
  142. return -1;
  143. function charToFloat(value, outMin, outMax) {
  144. var tmp_value = value / 255.0;
  145. var out = tmp_value * (outMax - outMin) + outMin;
  146. return out;
  147. }
  148. function enumToWave(value) {
  149. switch(value) {
  150. case 1: return SOROLLET.Voice.prototype.getTriangleBuffer;
  151. case 2: return SOROLLET.Voice.prototype.getSquareBuffer;
  152. case 3: return SOROLLET.Voice.prototype.getSawtoothBuffer;
  153. }
  154. return SOROLLET.Voice.prototype.getSineBuffer;
  155. }
  156. };