Last active
          January 6, 2021 17:04 
        
      - 
      
- 
        Save petersalomonsen/c3ad6c376c23677caa41eb79dddb5485 to your computer and use it in GitHub Desktop. 
    Physical modeling synthesis experiments with AssemblyScript
  
        
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | /* | |
| * Copyright (c) 2020 - Peter Johan Salomonsen | |
| */ | |
| setBPM(105); | |
| addInstrument('piano'); | |
| addInstrument('string'); | |
| addInstrument('drums'); | |
| addInstrument('brass'); | |
| addInstrument('guitar'); | |
| addInstrument('bass'); | |
| async function metronome() { | |
| await createTrack(2).steps(4, [ | |
| [fs5],,fs5(1/8,30),, | |
| ].repeat(3)); | |
| } | |
| async function part1(buildup=false) { | |
| createTrack(0).play([[ 0.06, d2(0.83, 72) ], | |
| [ 0.05, a4(0.95, 84) ], | |
| [ 0.04, f4(0.97, 84) ], | |
| [ 0.07, c5(0.93, 70) ], | |
| [ 0.06, e5(0.98, 63) ], | |
| [ 1.03, a2(0.14, 72) ], | |
| [ 1.25, c3(0.17, 84) ], | |
| [ 1.83, a4(0.03, 88) ], | |
| [ 1.85, c5(0.03, 72) ], | |
| [ 1.83, e5(0.07, 55) ], | |
| [ 1.77, d3(0.16, 84) ], | |
| [ 1.82, f4(0.13, 94) ], | |
| [ 2.29, c3(0.14, 68) ], | |
| [ 2.82, a2(0.15, 72) ], | |
| [ 2.97, c3(0.18, 87) ], | |
| [ 3.48, d3(0.34, 87) ], | |
| [ 3.99, f4(1.27, 88) ], | |
| [ 3.99, a4(1.27, 88) ], | |
| [ 4.02, c5(1.32, 75) ], | |
| [ 4.02, e5(1.37, 65) ], | |
| [ 4.01, d2(1.45, 75) ], | |
| [ 5.74, d3(0.14, 64) ], | |
| [ 5.96, b4(0.52, 84) ], | |
| [ 5.98, d5(0.55, 77) ], | |
| [ 5.96, g4(0.57, 89) ], | |
| [ 5.95, e5(0.61, 74) ], | |
| [ 5.98, e2(0.67, 77) ], | |
| [ 6.81, e3(0.11, 59) ], | |
| [ 6.95, f5(0.43, 82) ], | |
| [ 6.92, g4(0.61, 83) ], | |
| [ 6.92, as4(0.63, 88) ], | |
| [ 6.95, cs5(0.60, 76) ], | |
| [ 6.95, a2(0.67, 77) ], | |
| [ 7.83, a4(0.03, 70) ], | |
| [ 7.81, c5(0.05, 68) ], | |
| [ 7.82, e5(0.05, 60) ], | |
| [ 7.77, d3(0.14, 59) ], | |
| [ 7.79, f4(0.12, 83) ], | |
| [ 8.33, a4(0.06, 65) ], | |
| [ 8.34, c5(0.06, 67) ], | |
| [ 8.35, e5(0.06, 37) ], | |
| [ 8.29, f4(0.14, 68) ], | |
| [ 7.97, d2(0.71, 75) ], | |
| [ 8.84, d3(0.14, 69) ], | |
| [ 9.00, a2(0.27, 88) ], | |
| [ 9.49, c3(0.14, 75) ], | |
| [ 9.98, d3(0.16, 83) ], | |
| [ 10.01, f4(0.21, 87) ], | |
| [ 10.02, c5(0.22, 70) ], | |
| [ 10.01, a4(0.23, 87) ], | |
| [ 10.01, e5(0.29, 68) ], | |
| [ 10.34, c3(0.14, 78) ], | |
| [ 10.87, f4(0.05, 75) ], | |
| [ 10.89, a4(0.05, 74) ], | |
| [ 10.89, c5(0.05, 69) ], | |
| [ 10.84, a2(0.12, 88) ], | |
| [ 11.30, c3(0.13, 74) ], | |
| [ 11.79, d3(0.13, 76) ], | |
| [ 12.03, f4(1.43, 80) ], | |
| [ 12.04, a4(1.48, 80) ], | |
| [ 12.00, d2(1.58, 70) ], | |
| [ 12.06, c5(1.58, 78) ], | |
| [ 12.03, e5(1.69, 72) ], | |
| [ 13.84, d3(0.06, 62) ], | |
| [ 14.02, b4(0.50, 89) ], | |
| [ 14.02, g4(0.50, 93) ], | |
| [ 14.00, d5(0.53, 84) ], | |
| [ 14.00, e5(0.55, 70) ], | |
| [ 14.03, e2(0.69, 75) ], | |
| [ 14.91, e3(0.05, 38) ], | |
| [ 15.05, f5(0.44, 83) ], | |
| [ 15.04, g4(0.53, 87) ], | |
| [ 15.05, cs5(0.55, 78) ], | |
| [ 15.01, as4(0.59, 89) ], | |
| [ 15.02, a2(0.63, 79) ], | |
| [ 15.86, c5(0.05, 65) ], | |
| [ 15.80, d3(0.15, 62) ], | |
| [ 15.83, f4(0.13, 78) ], | |
| [ 15.84, a4(0.16, 70) ], | |
| [ 15.86, e5(0.19, 57) ], | |
| [ 16.37, a4(0.04, 67) ], | |
| [ 16.33, f4(0.14, 69) ], | |
| [ 16.36, c5(0.17, 52) ], | |
| [ 16.35, e5(0.22, 37) ], | |
| [ 15.98, d2(0.67, 75) ], | |
| [ 16.88, d3(0.12, 49) ], | |
| [ 17.04, a2(0.25, 83) ], | |
| [ 17.53, c3(0.12, 69) ], | |
| [ 18.08, c5(0.05, 77) ], | |
| [ 18.05, d3(0.15, 83) ], | |
| [ 18.06, f4(0.22, 92) ], | |
| [ 18.18, c5(0.14, 6) ], | |
| [ 18.07, a4(0.25, 92) ], | |
| [ 18.07, e5(0.31, 68) ], | |
| [ 18.36, c3(0.17, 75) ], | |
| [ 18.88, a2(0.17, 68) ], | |
| [ 19.38, c3(0.14, 84) ], | |
| [ 19.89, d3(0.12, 78) ], | |
| [ 20.06, f4(1.32, 87) ], | |
| [ 20.07, a4(1.35, 87) ], | |
| [ 20.09, c5(1.39, 75) ], | |
| [ 20.09, e5(1.49, 63) ], | |
| [ 20.10, d2(1.51, 72) ], | |
| [ 21.83, d3(0.08, 65) ], | |
| [ 22.05, b4(0.54, 89) ], | |
| [ 22.04, e5(0.56, 79) ], | |
| [ 22.05, g4(0.56, 94) ], | |
| [ 22.07, d5(0.55, 83) ], | |
| [ 22.04, e2(0.65, 72) ], | |
| [ 22.89, e3(0.05, 62) ], | |
| [ 23.05, f5(0.43, 83) ], | |
| [ 23.05, g4(0.50, 83) ], | |
| [ 23.05, cs5(0.51, 76) ], | |
| [ 23.03, as4(0.55, 83) ], | |
| [ 23.06, a2(0.64, 75) ], | |
| [ 23.88, a4(0.04, 77) ], | |
| [ 23.88, c5(0.05, 69) ], | |
| [ 23.89, e5(0.05, 57) ], | |
| [ 23.86, f4(0.13, 87) ], | |
| [ 23.84, d3(0.16, 65) ], | |
| [ 24.35, f4(0.14, 77) ], | |
| [ 24.37, a4(0.17, 78) ], | |
| [ 24.38, c5(0.17, 69) ], | |
| [ 24.38, e5(0.25, 54) ], | |
| [ 24.01, d2(0.64, 77) ], | |
| [ 24.85, d3(0.16, 62) ], | |
| [ 25.03, a2(0.25, 89) ], | |
| [ 25.51, c3(0.12, 69) ], | |
| [ 26.02, d3(0.17, 90) ], | |
| [ 26.03, f4(0.24, 90) ], | |
| [ 26.05, a4(0.25, 87) ], | |
| [ 26.05, c5(0.26, 77) ], | |
| [ 26.04, e5(0.34, 67) ], | |
| [ 26.34, c3(0.20, 78) ], | |
| [ 26.86, a2(0.17, 82) ], | |
| [ 27.37, c3(0.13, 77) ], | |
| [ 27.87, d3(0.13, 75) ], | |
| [ 28.06, f4(1.37, 93) ], | |
| [ 28.06, a4(1.37, 88) ], | |
| [ 28.09, c5(1.43, 82) ], | |
| [ 28.09, d2(1.49, 83) ], | |
| [ 28.09, e5(1.57, 70) ], | |
| [ 29.85, d3(0.05, 50) ], | |
| [ 30.06, b4(0.37, 97) ], | |
| [ 30.08, d5(0.38, 89) ], | |
| [ 30.06, g4(0.43, 98) ], | |
| [ 30.05, e5(0.44, 82) ], | |
| [ 30.08, e2(0.56, 82) ], | |
| [ 30.88, e3(0.06, 54) ], | |
| [ 31.03, a2(0.64, 83) ], | |
| [ 31.06, f5(0.61, 82) ], | |
| [ 31.05, g4(0.64, 84) ], | |
| [ 31.05, cs5(0.68, 78) ], | |
| [ 31.03, as4(0.70, 81) ]].quantize(4)); | |
| createTrack(3).play([[ 5.96, gs5(0.18, 88) ], | |
| [ 5.96, gs6(0.18, 94) ], | |
| [ 6.27, g5(0.20, 100) ], | |
| [ 6.27, g6(0.20, 105) ], | |
| [ 6.77, f6(0.12, 94) ], | |
| [ 6.76, f5(0.14, 90) ], | |
| [ 7.25, d5(0.12, 97) ], | |
| [ 7.25, d6(0.14, 95) ], | |
| [ 7.72, c5(0.7, 97) ], | |
| [ 7.73, c6(0.7, 92) ], | |
| [ 8.34, d5(0.25, 99) ], | |
| [ 8.34, d6(0.27, 100) ]].quantize(4)); | |
| createTrack(1).play([[ 14.09, g5(0.82, 87) ], | |
| [ 14.93, f5(1.08, 87) ], | |
| [ 16.02, e5(1.44, 83) ], | |
| [ 17.45, c5(0.53, 75) ], | |
| [ 18.04, a4(3.92, 70) ], | |
| [ 21.98, b4(1.00, 75) ], | |
| [ 22.94, c5(0.95, 68) ], | |
| [ 23.94, a4(5.14, 77) ]].quantize(4)); | |
| if ( buildup ) { | |
| createTrack(3).play([[ 30.56, c5(0.26, 102) ], | |
| [ 30.56, c6(0.29, 100) ], | |
| [ 31.32, d5(0.18, 97) ], | |
| [ 31.32, d6(0.25, 97) ]].quantize(4)); | |
| } | |
| createTrack(5).play([[ 0.01, d2(0.89, 127) ], | |
| [ 3.50, d2(0.25, 127) ], | |
| [ 4.03, d2(0.44, 127) ], | |
| [ 5.97, e2(0.84, 110) ], | |
| [ 6.92, a2(0.85, 100) ], | |
| [ 7.92, d2(1.33, 127) ], | |
| [ 11.75, d2(0.15, 100) ], | |
| [ 12.00, d2(0.70, 100) ], | |
| [ 13.95, f2(0.49, 127) ], | |
| [ 13.95, e2(0.88, 90) ], | |
| [ 14.95, a2(1.0, 90) ], | |
| [ 15.97, d2(1.08, 110) ], | |
| [ 20.01, d2(0.56, 127) ], | |
| [ 21.97, e2(0.84, 110) ], | |
| [ 22.97, a2(0.76, 100) ], | |
| [ 23.96, d2(1.85, 127) ], | |
| [ 28.05, d2(1.30, 127) ], | |
| [ 29.96, e2(0.84, 127) ], | |
| [ 31.01, f2(0.94, 127) ]].quantize(4)); | |
| for(var n=0;n<4;n++) { | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],,fs5(1/8,30),, | |
| ].repeat(7)); | |
| } | |
| } | |
| await part1(); | |
| await part1(true); | |
| // --------------------- part2 | |
| async function part2() { | |
| createTrack(0).play([[ 0.16, controlchange(64, 127) ], | |
| [ 0.10, g3(3.28, 77) ], | |
| [ 0.10, as4(3.41, 78) ], | |
| [ 0.07, a4(3.47, 84) ], | |
| [ 0.10, d5(3.44, 67) ], | |
| [ 3.39, a3(0.16, 54) ], | |
| [ 0.10, f5(3.66, 74) ], | |
| [ 3.96, controlchange(64, 0) ], | |
| [ 4.28, controlchange(64, 127) ], | |
| [ 4.04, f5(0.51, 68) ], | |
| [ 4.04, d5(0.59, 75) ], | |
| [ 4.02, a4(0.63, 88) ], | |
| [ 4.02, as4(0.63, 82) ], | |
| [ 4.01, as3(0.94, 82) ], | |
| [ 4.81, as4(0.20, 71) ], | |
| [ 4.84, a4(0.18, 89) ], | |
| [ 4.84, d5(0.23, 79) ], | |
| [ 4.84, f5(0.24, 64) ], | |
| [ 5.19, controlchange(64, 0) ], | |
| [ 6.05, controlchange(64, 127) ], | |
| [ 5.52, f5(1.69, 67) ], | |
| [ 5.52, g4(1.75, 72) ], | |
| [ 5.51, cs5(1.79, 73) ], | |
| [ 5.57, a3(1.82, 52) ], | |
| [ 7.95, d4(0.03, 44) ], | |
| [ 8.02, controlchange(64, 0) ], | |
| [ 9.16, controlchange(64, 127) ], | |
| [ 7.91, f4(3.54, 69) ], | |
| [ 8.08, d3(3.39, 74) ], | |
| [ 8.00, a4(3.51, 75) ], | |
| [ 8.11, e5(3.53, 55) ], | |
| [ 8.06, c5(3.60, 70) ], | |
| [ 11.92, controlchange(64, 0) ], | |
| [ 12.17, controlchange(64, 127) ], | |
| [ 12.99, c5(0.16, 89) ], | |
| [ 12.00, d3(1.21, 75) ], | |
| [ 12.97, a4(0.23, 100) ], | |
| [ 13.00, d5(0.25, 82) ], | |
| [ 12.99, f5(0.34, 89) ], | |
| [ 13.66, controlchange(64, 0) ], | |
| [ 13.45, d3(0.24, 60) ], | |
| [ 14.12, controlchange(64, 127) ], | |
| [ 13.99, d5(0.15, 84) ], | |
| [ 13.99, g5(0.50, 90) ], | |
| [ 14.05, e5(0.50, 74) ], | |
| [ 14.01, b4(0.57, 84) ], | |
| [ 13.97, e3(0.82, 70) ], | |
| [ 14.91, controlchange(64, 0) ], | |
| [ 15.17, controlchange(64, 127) ], | |
| [ 15.02, c5(0.48, 82) ], | |
| [ 15.03, d5(0.53, 82) ], | |
| [ 14.99, f3(0.59, 82) ], | |
| [ 15.02, a4(0.62, 90) ], | |
| [ 15.02, f5(0.77, 88) ], | |
| [ 15.95, controlchange(64, 0) ], | |
| [ 16.27, controlchange(64, 127) ], | |
| [ 16.04, as4(3.35, 82) ], | |
| [ 16.04, a4(3.39, 87) ], | |
| [ 16.02, f5(3.49, 60) ], | |
| [ 16.05, d5(3.62, 70) ], | |
| [ 16.07, g3(3.61, 64) ], | |
| [ 19.93, controlchange(64, 0) ], | |
| [ 20.07, f5(0.04, 53) ], | |
| [ 20.23, controlchange(64, 127) ], | |
| [ 20.88, controlchange(64, 0) ], | |
| [ 21.10, controlchange(64, 127) ], | |
| [ 20.02, c5(1.20, 75) ], | |
| [ 20.02, gs4(1.29, 75) ], | |
| [ 20.28, f5(1.06, 11) ], | |
| [ 20.04, as3(1.32, 63) ], | |
| [ 20.05, d5(1.34, 62) ], | |
| [ 21.54, controlchange(64, 0) ], | |
| [ 21.92, controlchange(64, 127) ], | |
| [ 21.51, f5(1.62, 83) ], | |
| [ 21.49, cs5(1.70, 72) ], | |
| [ 21.49, g4(1.82, 92) ], | |
| [ 21.51, a3(1.82, 70) ], | |
| [ 23.90, controlchange(64, 0) ], | |
| [ 23.85, d4(0.06, 28) ], | |
| [ 24.21, controlchange(64, 127) ], | |
| [ 23.80, f4(2.65, 59) ], | |
| [ 23.88, a4(2.60, 70) ], | |
| [ 23.95, c5(2.64, 60) ], | |
| [ 24.00, e5(2.63, 57) ], | |
| [ 24.00, d3(3.30, 64) ], | |
| [ 27.91, controlchange(64, 0) ], | |
| [ 27.88, a3(0.10, 49) ], | |
| [ 28.03, a2(0.27, 70) ], | |
| [ 28.01, f5(0.36, 63) ], | |
| [ 27.85, cs5(0.52, 53) ], | |
| [ 28.06, c6(0.31, 78) ], | |
| [ 28.05, g5(0.35, 69) ], | |
| [ 29.02, a2(0.26, 75) ], | |
| [ 29.03, c6(0.29, 83) ], | |
| [ 29.01, cs5(0.38, 81) ], | |
| [ 29.03, f5(0.37, 75) ], | |
| [ 29.03, g5(0.39, 75) ], | |
| [ 30.03, a2(1.05, 79) ], | |
| [ 29.99, cs5(1.23, 83) ], | |
| [ 30.00, as5(1.23, 88) ], | |
| [ 30.02, f5(1.23, 79) ], | |
| [ 30.02, g5(1.26, 83) ]].quantize(4)); | |
| createTrack(4).play([[ 1.32, a5(0.23, 55) ], | |
| [ 1.56, d6(0.42, 68) ], | |
| [ 2.05, e6(0.31, 84) ], | |
| [ 2.53, f6(0.26, 87) ], | |
| [ 3.05, e6(0.29, 83) ], | |
| [ 3.34, d6(0.18, 77) ], | |
| [ 3.79, c6(0.21, 67) ], | |
| [ 4.29, a5(0.19, 68) ], | |
| [ 4.97, gs5(0.25, 84) ], | |
| [ 5.50, g5(0.30, 72) ], | |
| [ 6.01, f5(0.20, 74) ], | |
| [ 6.27, g5(0.24, 70) ], | |
| [ 6.78, g5(0.24, 72) ], | |
| [ 7.20, g5(0.20, 74) ], | |
| [ 7.35, gs5(0.18, 62) ], | |
| [ 7.78, g5(0.39, 72) ], | |
| [ 8.30, f5(0.16, 60) ], | |
| [ 8.54, d5(0.21, 53) ], | |
| [ 8.85, c5(0.06, 54) ], | |
| [ 9.08, f5(0.44, 79) ], | |
| [ 9.49, d5(0.31, 63) ], | |
| [ 9.80, c5(0.18, 75) ], | |
| [ 10.27, d5(0.17, 65) ], | |
| [ 10.77, c5(0.17, 84) ], | |
| [ 11.24, a4(0.17, 72) ], | |
| [ 11.77, gs4(0.21, 77) ], | |
| [ 12.23, g4(0.18, 62) ], | |
| [ 12.76, gs4(0.20, 83) ], | |
| [ 13.24, a4(0.20, 74) ], | |
| [ 13.77, c5(0.25, 77) ], | |
| [ 14.28, d5(0.20, 63) ], | |
| [ 14.84, c5(0.20, 68) ], | |
| [ 14.99, d5(0.41, 75) ], | |
| [ 15.49, f5(0.28, 78) ], | |
| [ 16.06, g5(0.25, 70) ], | |
| [ 16.53, gs5(0.18, 72) ], | |
| [ 16.71, a5(0.18, 52) ], | |
| [ 17.07, c6(0.29, 77) ], | |
| [ 17.56, d6(0.22, 74) ], | |
| [ 17.75, c6(0.40, 35) ], | |
| [ 18.30, d6(0.23, 65) ], | |
| [ 18.75, f6(0.44, 75) ], | |
| [ 19.26, g6(0.26, 68) ], | |
| [ 19.78, f6(0.04, 14) ], | |
| [ 20.01, g6(0.20, 40) ], | |
| [ 20.06, gs6(0.27, 48) ], | |
| [ 20.55, g6(0.20, 53) ], | |
| [ 20.78, f6(0.09, 56) ], | |
| [ 21.07, g6(0.22, 65) ], | |
| [ 21.28, f6(0.14, 64) ], | |
| [ 21.57, d6(0.20, 67) ], | |
| [ 22.08, f6(0.05, 25) ], | |
| [ 22.04, c6(0.17, 15) ], | |
| [ 22.34, f6(0.37, 60) ], | |
| [ 22.91, d6(0.24, 50) ], | |
| [ 23.42, c6(0.23, 60) ], | |
| [ 23.94, a5(0.18, 60) ], | |
| [ 24.46, gs5(0.20, 65) ], | |
| [ 24.97, g5(0.23, 70) ], | |
| [ 25.26, f5(0.08, 32) ], | |
| [ 25.75, g5(0.25, 70) ], | |
| [ 26.24, g5(0.22, 65) ], | |
| [ 26.35, gs5(0.18, 71) ], | |
| [ 26.78, g5(0.27, 94) ], | |
| [ 27.30, f5(0.18, 67) ], | |
| [ 27.52, d5(0.23, 52) ], | |
| [ 27.83, c5(0.17, 59) ], | |
| [ 28.06, f5(0.30, 93) ], | |
| [ 28.53, f5(0.27, 89) ], | |
| [ 29.05, d5(0.21, 89) ], | |
| [ 29.27, c5(0.14, 67) ], | |
| [ 29.74, f5(0.28, 78) ], | |
| [ 30.25, f5(0.24, 82) ], | |
| [ 30.90, f5(0.18, 63) ], | |
| [ 31.03, d5(0.45, 84) ], | |
| [ 31.51, c5(0.44, 72) ]].quantize(4)); | |
| createTrack(1).play([[ 0.05, as5(3.86, 61) ], | |
| [ 0.08, g4(3.83, 37) ], | |
| [ 0.11, d5(3.83, 14) ], | |
| [ 0.06, f5(5.69, 60) ], | |
| [ 3.95, as4(2.09, 44) ], | |
| [ 6.02, e5(1.73, 54) ], | |
| [ 6.06, a4(1.98, 62) ], | |
| [ 3.97, d6(4.12, 54) ], | |
| [ 8.18, cs6(0.05, 17) ], | |
| [ 8.19, d4(7.72, 37) ], | |
| [ 8.48, c6(7.47, 55) ], | |
| [ 15.96, as5(3.96, 58) ], | |
| [ 16.02, g4(3.95, 44) ], | |
| [ 12.02, f5(9.66, 30) ], | |
| [ 20.03, d6(1.90, 53) ], | |
| [ 19.98, as4(1.99, 58) ], | |
| [ 21.96, cs6(1.77, 56) ], | |
| [ 22.02, a4(1.91, 53) ], | |
| [ 3.98, a5(19.97, 59) ], | |
| [ 21.99, g5(2.29, 54) ], | |
| [ 23.96, c6(3.51, 59) ], | |
| [ 21.98, e6(5.81, 44) ], | |
| [ 23.96, d5(4.06, 50) ], | |
| [ 28.06, a4(3.86, 49) ], | |
| [ 28.05, f6(3.89, 68) ], | |
| [ 24.42, a5(7.58, 60) ], | |
| [ 27.99, cs6(3.9, 64) ]].quantize(1)); | |
| createTrack(5).play([[ 0.05, g2(3.36, 127) ], | |
| [ 3.45, a2(0.20, 110) ], | |
| [ 3.95, as2(1.83, 99) ], | |
| [ 6.01, a2(1.86, 100) ], | |
| [ 7.93, d2(5.68, 115) ], | |
| [ 13.95, e2(0.92, 127) ], | |
| [ 15.01, f2(0.73, 127) ], | |
| [ 15.96, g2(3.47, 127) ], | |
| [ 19.40, a2(0.27, 80) ], | |
| [ 19.95, as2(1.81, 99) ], | |
| [ 21.87, a2(1.98, 100) ], | |
| [ 23.94, d3(3.86, 110) ], | |
| [ 27.96, a2(3.64, 120) ]].quantize(4)); | |
| for(var n=0;n<4;n++) { | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],,fs5(1/8,50),fs5(1/8,10), | |
| [d5,c5(1/8,80),fs5],,fs5(1/8,50),, | |
| ].repeat(n === 3 ? 2: 3)); | |
| if (n===3) { | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],d5(1/8,30),fs5(1/8,50),[d5(1/8,40), fs5(1/8,10)], | |
| [d5,c5(1/8,80),fs5],d5(1/8,40),fs5(1/8,10),d5(1/16,50), | |
| ]); | |
| } | |
| } | |
| } | |
| await part2(); | |
| await part1(); | |
| await part1(true); | |
| // -------- crazy part | |
| function crazypiano() { | |
| createTrack(0).play([[ 0.04, a4(0.24, 74) ], | |
| [ 0.05, f5(0.25, 72) ], | |
| [ 0.04, c5(0.29, 74) ], | |
| [ 0.01, d2(0.39, 60) ], | |
| [ 1.01, d3(0.18, 77) ], | |
| [ 1.01, a4(0.24, 92) ], | |
| [ 1.04, f5(0.24, 75) ], | |
| [ 1.02, c5(0.29, 84) ], | |
| [ 1.77, g4(0.16, 72) ], | |
| [ 1.77, c5(0.17, 72) ], | |
| [ 1.77, e5(0.20, 58) ], | |
| [ 1.94, d2(0.40, 82) ], | |
| [ 2.32, g4(0.16, 74) ], | |
| [ 2.30, c5(0.27, 72) ], | |
| [ 2.31, e5(0.26, 70) ], | |
| [ 2.75, d2(0.19, 67) ], | |
| [ 3.00, g4(0.27, 88) ], | |
| [ 2.99, d3(0.31, 84) ], | |
| [ 3.01, c5(0.33, 87) ], | |
| [ 2.99, e5(0.39, 72) ], | |
| [ 3.51, c5(0.30, 90) ], | |
| [ 3.53, f5(0.35, 84) ], | |
| [ 3.51, a4(0.43, 90) ], | |
| [ 4.01, g2(0.54, 82) ], | |
| [ 4.49, a4(0.33, 87) ], | |
| [ 4.48, as4(0.39, 88) ], | |
| [ 4.50, d5(0.40, 79) ], | |
| [ 4.99, g3(0.24, 87) ], | |
| [ 5.25, as4(0.22, 77) ], | |
| [ 5.26, a4(0.21, 88) ], | |
| [ 5.27, d5(0.30, 77) ], | |
| [ 5.74, g4(0.19, 87) ], | |
| [ 5.75, c5(0.23, 78) ], | |
| [ 5.75, e5(0.26, 68) ], | |
| [ 6.28, g4(0.19, 87) ], | |
| [ 5.89, a2(0.68, 83) ], | |
| [ 6.25, e5(0.35, 47) ], | |
| [ 6.26, c5(0.34, 65) ], | |
| [ 6.76, a3(0.17, 64) ], | |
| [ 6.87, g4(0.46, 63) ], | |
| [ 6.92, c5(0.47, 83) ], | |
| [ 6.93, c3(0.49, 89) ], | |
| [ 6.93, e5(0.49, 84) ], | |
| [ 7.45, cs3(0.47, 84) ], | |
| [ 7.98, a4(0.33, 100) ], | |
| [ 7.98, c5(0.36, 94) ], | |
| [ 8.00, f5(0.35, 88) ], | |
| [ 7.98, d3(0.47, 79) ], | |
| [ 8.97, a4(0.31, 90) ], | |
| [ 8.97, f5(0.39, 89) ], | |
| [ 8.97, c5(0.44, 85) ], | |
| [ 8.99, d2(0.46, 83) ], | |
| [ 9.83, g4(0.20, 88) ], | |
| [ 9.81, c5(0.25, 82) ], | |
| [ 9.83, e5(0.25, 68) ], | |
| [ 10.02, d2(0.34, 90) ], | |
| [ 10.35, g4(0.14, 79) ], | |
| [ 10.31, c5(0.29, 65) ], | |
| [ 10.31, e5(0.30, 54) ], | |
| [ 10.91, g4(0.36, 32) ], | |
| [ 11.02, c5(0.39, 87) ], | |
| [ 11.02, e5(0.44, 79) ], | |
| [ 10.90, d2(0.59, 89) ], | |
| [ 11.57, c5(0.35, 94) ], | |
| [ 11.58, f5(0.43, 88) ], | |
| [ 11.57, a4(0.44, 100) ], | |
| [ 12.55, a4(0.28, 94) ], | |
| [ 12.54, as4(0.33, 93) ], | |
| [ 12.01, g2(0.85, 74) ], | |
| [ 12.55, d5(0.34, 84) ], | |
| [ 12.99, g3(0.19, 84) ], | |
| [ 13.30, a4(0.26, 90) ], | |
| [ 13.29, as4(0.29, 88) ], | |
| [ 13.30, d5(0.35, 83) ], | |
| [ 13.81, c5(0.17, 79) ], | |
| [ 13.82, g4(0.16, 88) ], | |
| [ 13.82, e5(0.23, 70) ], | |
| [ 14.33, g4(0.14, 72) ], | |
| [ 13.97, a2(0.56, 87) ], | |
| [ 14.32, c5(0.24, 75) ], | |
| [ 14.29, e5(0.29, 49) ], | |
| [ 14.82, a3(0.15, 60) ], | |
| [ 14.89, g4(0.52, 58) ], | |
| [ 15.00, c3(0.47, 89) ], | |
| [ 15.01, c5(0.49, 83) ], | |
| [ 15.03, e5(0.52, 77) ], | |
| [ 15.50, cs3(0.48, 77) ], | |
| [ 16.02, a4(0.33, 95) ], | |
| [ 16.03, f5(0.34, 84) ], | |
| [ 16.02, c5(0.36, 90) ], | |
| [ 16.00, d3(0.49, 79) ], | |
| [ 16.99, a4(0.33, 103) ], | |
| [ 17.00, f5(0.37, 94) ], | |
| [ 17.02, d2(0.37, 83) ], | |
| [ 16.99, c5(0.42, 94) ], | |
| [ 17.82, g4(0.22, 84) ], | |
| [ 17.80, c5(0.27, 82) ], | |
| [ 17.83, e5(0.26, 67) ], | |
| [ 18.07, d2(0.39, 83) ], | |
| [ 18.33, g4(0.20, 67) ], | |
| [ 18.31, e5(0.28, 53) ], | |
| [ 18.30, c5(0.33, 62) ], | |
| [ 18.89, d2(0.20, 74) ], | |
| [ 18.90, g4(0.43, 28) ], | |
| [ 19.06, c5(0.36, 89) ], | |
| [ 19.06, e5(0.36, 83) ], | |
| [ 19.09, d3(0.35, 94) ], | |
| [ 19.57, c5(0.27, 95) ], | |
| [ 19.56, a4(0.38, 89) ], | |
| [ 19.58, f5(0.39, 88) ], | |
| [ 20.52, a4(0.31, 95) ], | |
| [ 20.50, as4(0.39, 91) ], | |
| [ 20.52, d5(0.39, 87) ], | |
| [ 20.04, g2(0.87, 83) ], | |
| [ 20.96, g3(0.23, 87) ], | |
| [ 21.27, a4(0.25, 95) ], | |
| [ 21.26, as4(0.29, 83) ], | |
| [ 21.27, d5(0.33, 77) ], | |
| [ 21.75, g4(0.16, 79) ], | |
| [ 21.75, c5(0.17, 70) ], | |
| [ 21.76, e5(0.20, 59) ], | |
| [ 22.27, g4(0.21, 82) ], | |
| [ 22.27, e5(0.28, 60) ], | |
| [ 22.28, c5(0.30, 87) ], | |
| [ 21.95, a2(0.85, 84) ], | |
| [ 22.76, g4(0.61, 20) ], | |
| [ 23.01, c5(0.39, 90) ], | |
| [ 23.01, e5(0.50, 84) ], | |
| [ 22.98, c3(0.53, 88) ], | |
| [ 23.49, cs3(0.49, 83) ], | |
| [ 24.01, a4(0.33, 100) ], | |
| [ 24.04, f5(0.31, 88) ], | |
| [ 24.02, c5(0.35, 97) ], | |
| [ 24.04, d3(0.41, 89) ], | |
| [ 24.97, a4(0.37, 95) ], | |
| [ 24.98, f5(0.44, 84) ], | |
| [ 24.97, c5(0.45, 89) ], | |
| [ 25.00, d2(0.44, 79) ], | |
| [ 25.80, g4(0.18, 82) ], | |
| [ 25.79, c5(0.24, 83) ], | |
| [ 25.79, e5(0.26, 70) ], | |
| [ 25.99, d2(0.42, 83) ], | |
| [ 26.33, g4(0.17, 83) ], | |
| [ 26.31, e5(0.28, 50) ], | |
| [ 26.31, c5(0.33, 65) ], | |
| [ 26.84, d2(0.27, 74) ], | |
| [ 27.12, d3(0.05, 54) ], | |
| [ 26.93, g4(0.40, 30) ], | |
| [ 27.03, c5(0.39, 87) ], | |
| [ 27.05, e5(0.39, 78) ], | |
| [ 27.57, c5(0.26, 79) ], | |
| [ 27.55, a4(0.39, 95) ], | |
| [ 27.57, f5(0.40, 87) ], | |
| [ 28.52, a4(0.31, 95) ], | |
| [ 28.02, g2(0.87, 78) ], | |
| [ 28.51, as4(0.40, 94) ], | |
| [ 28.53, d5(0.39, 84) ], | |
| [ 28.98, g3(0.30, 87) ], | |
| [ 29.27, a4(0.23, 95) ], | |
| [ 29.26, as4(0.28, 83) ], | |
| [ 29.27, d5(0.33, 75) ], | |
| [ 29.79, g4(0.15, 79) ], | |
| [ 29.77, c5(0.19, 72) ], | |
| [ 29.80, e5(0.20, 67) ], | |
| [ 30.30, g4(0.21, 72) ], | |
| [ 30.28, c5(0.30, 70) ], | |
| [ 30.25, e5(0.34, 38) ], | |
| [ 29.94, a2(0.69, 84) ], | |
| [ 30.84, a3(0.17, 64) ], | |
| [ 31.00, c3(0.50, 89) ], | |
| [ 30.91, g4(0.77, 62) ], | |
| [ 31.02, c5(0.68, 87) ], | |
| [ 31.03, e5(0.68, 79) ], | |
| [ 31.53, cs3(0.42, 64) ]].quantize(4)); | |
| } | |
| function crazybase() { | |
| createTrack(5).play([ | |
| [ 0, d2(1.5, 75) ], | |
| [ 1.78, a2(0.17, 60) ], | |
| [ 1.97, c3(0.24, 79) ], | |
| [ 2.51, d3(0.23, 84) ], | |
| [ 3.04, c3(0.48, 83) ], | |
| [ 3.52, a2(0.29, 83) ], | |
| [ 4.02, g2(1.72, 92) ], | |
| [ 5.81, g3(0.15, 67) ], | |
| [ 6.03, a2(0.50, 98) ], | |
| [ 6.51, a3(0.16, 82) ], | |
| [ 6.99, c3(0.56, 80) ], | |
| [ 7.51, c4(0.15, 79) ], | |
| [ 8.03, d2(1.69, 82) ], | |
| [ 9.80, a2(0.20, 68) ], | |
| [ 9.97, c3(0.21, 93) ], | |
| [ 10.49, d3(0.21, 94) ], | |
| [ 10.98, c3(0.49, 93) ], | |
| [ 11.44, a2(0.36, 84) ], | |
| [ 11.99, g2(1.70, 87) ], | |
| [ 13.77, g3(0.16, 78) ], | |
| [ 13.98, a2(0.49, 97) ], | |
| [ 14.45, a3(0.20, 70) ], | |
| [ 14.97, c3(0.57, 93) ], | |
| [ 15.49, c4(0.16, 63) ], | |
| [ 16.01, d2(1.75, 72) ], | |
| [ 17.79, a2(0.22, 60) ], | |
| [ 18.02, c3(0.20, 90) ], | |
| [ 18.50, d3(0.17, 92) ], | |
| [ 19.00, c3(0.50, 94) ], | |
| [ 19.48, a2(0.21, 87) ], | |
| [ 19.99, g2(1.75, 88) ], | |
| [ 21.76, g3(0.17, 69) ], | |
| [ 22.00, a2(0.50, 98) ], | |
| [ 22.46, a3(0.17, 75) ], | |
| [ 22.96, c3(0.60, 88) ], | |
| [ 23.49, c4(0.18, 75) ], | |
| [ 24.03, d2(1.76, 87) ], | |
| [ 25.84, a2(0.16, 68) ], | |
| [ 26.01, c3(0.21, 88) ], | |
| [ 26.52, d3(0.20, 84) ], | |
| [ 27.00, c3(0.53, 83) ], | |
| [ 27.49, a2(0.18, 73) ], | |
| [ 27.97, g2(1.76, 80) ], | |
| [ 29.75, g3(0.17, 74) ], | |
| [ 29.98, a2(0.47, 80) ], | |
| [ 30.44, a3(0.16, 77) ], | |
| [ 30.96, c3(0.60, 87) ], | |
| [ 31.54, c4(0.24, 59) ]].quantize(4)); | |
| } | |
| function crazybrass() { | |
| createTrack(3).play([[ 0.08, d5(0.24, 99) ], | |
| [ 0.07, a5(0.27, 119) ], | |
| [ 0.08, d6(0.26, 102) ], | |
| [ 1.00, d5(0.25, 95) ], | |
| [ 1.00, d6(0.29, 94) ], | |
| [ 0.98, a5(0.31, 104) ], | |
| [ 2.00, c5(0.80, 94) ], | |
| [ 1.98, c6(0.85, 95) ], | |
| [ 1.99, g5(0.84, 102) ], | |
| [ 2.77, a5(0.16, 102) ], | |
| [ 2.77, d5(0.17, 95) ], | |
| [ 2.78, d6(0.18, 94) ], | |
| [ 4.53, d5(0.18, 88) ], | |
| [ 4.51, d6(0.25, 104) ], | |
| [ 4.51, a5(0.26, 100) ], | |
| [ 5.32, d5(0.20, 89) ], | |
| [ 5.32, a5(0.23, 100) ], | |
| [ 5.30, d6(0.28, 100) ], | |
| [ 6.06, d6(0.20, 97) ], | |
| [ 6.07, f5(0.20, 88) ], | |
| [ 6.06, f6(0.33, 99) ], | |
| [ 6.52, a5(0.19, 95) ], | |
| [ 6.50, d6(0.22, 83) ], | |
| [ 6.54, d5(0.24, 82) ], | |
| [ 7.02, g5(0.17, 92) ], | |
| [ 7.00, c6(0.28, 93) ], | |
| [ 7.02, c5(0.29, 83) ], | |
| [ 7.29, d5(0.26, 90) ], | |
| [ 7.32, d6(0.28, 89) ], | |
| [ 7.34, a5(0.26, 89) ], | |
| [ 8.00, d5(0.28, 89) ], | |
| [ 7.99, d6(0.29, 90) ], | |
| [ 7.97, a5(0.31, 99) ], | |
| [ 8.98, d5(0.28, 89) ], | |
| [ 8.98, a5(0.29, 94) ], | |
| [ 8.97, d6(0.33, 93) ], | |
| [ 10.01, g5(0.55, 98) ], | |
| [ 10.01, c5(0.73, 87) ], | |
| [ 9.99, c6(0.81, 97) ], | |
| [ 10.75, a5(0.13, 95) ], | |
| [ 10.74, d6(0.15, 100) ], | |
| [ 10.76, d5(0.13, 94) ], | |
| [ 12.54, d5(0.21, 84) ], | |
| [ 12.52, a5(0.25, 90) ], | |
| [ 12.52, d6(0.27, 93) ], | |
| [ 13.29, d5(0.13, 89) ], | |
| [ 13.28, a5(0.21, 94) ], | |
| [ 13.28, d6(0.23, 98) ], | |
| [ 14.04, f5(0.17, 89) ], | |
| [ 14.01, d6(0.23, 92) ], | |
| [ 14.02, f6(0.28, 94) ], | |
| [ 14.51, a5(0.17, 88) ], | |
| [ 14.52, d6(0.20, 93) ], | |
| [ 14.54, d5(0.21, 78) ], | |
| [ 15.05, g5(0.21, 98) ], | |
| [ 15.04, c5(0.29, 88) ], | |
| [ 15.07, c6(0.31, 94) ], | |
| [ 15.33, d5(0.23, 84) ], | |
| [ 15.31, d6(0.29, 77) ], | |
| [ 15.41, a5(0.22, 75) ], | |
| [ 15.98, d6(0.25, 95) ], | |
| [ 16.00, a5(0.24, 87) ], | |
| [ 16.00, d5(0.24, 89) ], | |
| [ 17.03, d5(0.24, 87) ], | |
| [ 17.03, a5(0.28, 94) ], | |
| [ 17.01, d6(0.31, 99) ], | |
| [ 17.99, g5(0.59, 102) ], | |
| [ 18.00, c5(0.83, 82) ], | |
| [ 18.00, c6(0.87, 100) ], | |
| [ 18.82, d6(0.17, 99) ], | |
| [ 18.83, d5(0.16, 90) ], | |
| [ 18.83, a5(0.17, 97) ], | |
| [ 20.56, a5(0.19, 94) ], | |
| [ 20.55, d6(0.21, 98) ], | |
| [ 20.57, d5(0.20, 90) ], | |
| [ 21.37, d5(0.13, 93) ], | |
| [ 21.35, d6(0.22, 100) ], | |
| [ 21.37, a5(0.22, 95) ], | |
| [ 22.03, d6(0.22, 90) ], | |
| [ 22.06, f5(0.21, 87) ], | |
| [ 22.06, f6(0.26, 94) ], | |
| [ 22.53, a5(0.20, 83) ], | |
| [ 22.53, d6(0.20, 88) ], | |
| [ 22.54, d5(0.22, 79) ], | |
| [ 23.05, g5(0.15, 93) ], | |
| [ 23.06, c6(0.25, 88) ], | |
| [ 23.06, c5(0.28, 89) ], | |
| [ 23.33, d5(0.28, 82) ], | |
| [ 23.36, a5(0.27, 83) ], | |
| [ 23.35, d6(0.29, 89) ], | |
| [ 24.02, a5(0.24, 95) ], | |
| [ 24.03, d5(0.24, 95) ], | |
| [ 24.02, d6(0.26, 97) ], | |
| [ 25.01, d5(0.24, 94) ], | |
| [ 25.01, a5(0.27, 95) ], | |
| [ 24.99, d6(0.29, 98) ], | |
| [ 25.96, c5(0.81, 90) ], | |
| [ 25.95, g5(0.87, 97) ], | |
| [ 25.95, c6(0.88, 102) ], | |
| [ 26.77, d5(0.14, 87) ], | |
| [ 26.76, a5(0.16, 98) ], | |
| [ 26.77, d6(0.18, 82) ], | |
| [ 28.50, d5(0.20, 89) ], | |
| [ 28.51, a5(0.21, 99) ], | |
| [ 28.52, d6(0.21, 92) ], | |
| [ 29.38, d5(0.14, 84) ], | |
| [ 29.41, a5(0.12, 100) ], | |
| [ 29.40, d6(0.18, 98) ], | |
| [ 29.97, f5(0.17, 78) ], | |
| [ 29.96, c6(0.24, 98) ], | |
| [ 29.96, f6(0.27, 98) ], | |
| [ 30.46, d6(0.18, 84) ], | |
| [ 30.47, d5(0.22, 75) ], | |
| [ 30.46, a5(0.23, 89) ], | |
| [ 30.97, c6(0.28, 89) ], | |
| [ 30.99, c5(0.30, 83) ], | |
| [ 30.99, g5(0.35, 83) ], | |
| [ 31.28, a5(0.17, 103) ], | |
| [ 31.25, d6(0.21, 77) ], | |
| [ 31.28, d5(0.19, 94) ]].quantize(4)); | |
| } | |
| function crazyguitar1() { | |
| createTrack(4).play([[ 0.99, d5(0.28, 68) ], | |
| [ 0.98, a4(0.29, 67) ], | |
| [ 2.02, c5(0.80, 75) ], | |
| [ 2.03, g4(0.82, 68) ], | |
| [ 2.83, a4(0.14, 87) ], | |
| [ 2.83, d5(0.14, 67) ], | |
| [ 3.56, as4(0.23, 71) ], | |
| [ 3.57, d5(0.22, 72) ], | |
| [ 4.52, as4(0.15, 72) ], | |
| [ 4.54, d5(0.15, 75) ], | |
| [ 5.28, as4(0.12, 63) ], | |
| [ 5.29, d5(0.14, 75) ], | |
| [ 6.05, f5(0.06, 70) ], | |
| [ 6.05, c5(0.11, 83) ], | |
| [ 6.49, c5(0.05, 79) ], | |
| [ 6.50, f5(0.15, 62) ], | |
| [ 7.00, e5(0.21, 67) ], | |
| [ 6.98, c5(0.23, 73) ], | |
| [ 7.42, c5(0.18, 60) ], | |
| [ 7.44, e5(0.18, 47) ], | |
| [ 7.96, d5(0.33, 64) ], | |
| [ 7.98, a4(0.33, 64) ], | |
| [ 8.97, a4(0.30, 64) ], | |
| [ 8.97, d5(0.36, 62) ], | |
| [ 9.94, g4(0.61, 72) ], | |
| [ 9.94, c5(0.76, 63) ], | |
| [ 10.78, d5(0.11, 72) ], | |
| [ 10.79, a4(0.14, 74) ], | |
| [ 11.58, d5(0.17, 65) ], | |
| [ 11.57, as4(0.20, 72) ], | |
| [ 12.54, d5(0.04, 74) ], | |
| [ 12.51, as4(0.12, 66) ], | |
| [ 13.37, d5(0.04, 74) ], | |
| [ 13.36, as4(0.09, 74) ], | |
| [ 14.03, c5(0.11, 69) ], | |
| [ 14.03, f5(0.17, 67) ], | |
| [ 14.50, c5(0.19, 69) ], | |
| [ 14.51, f5(0.19, 65) ], | |
| [ 15.03, e5(0.18, 74) ], | |
| [ 15.02, c5(0.21, 74) ], | |
| [ 15.50, e5(0.16, 54) ], | |
| [ 15.49, c5(0.20, 63) ], | |
| [ 16.52, a4(0.14, 68) ], | |
| [ 16.53, d5(0.14, 72) ], | |
| [ 17.25, a4(0.12, 74) ], | |
| [ 17.25, d5(0.14, 79) ], | |
| [ 18.06, c5(0.69, 73) ], | |
| [ 18.06, g4(0.74, 73) ], | |
| [ 18.77, a4(0.16, 73) ], | |
| [ 18.81, d5(0.14, 72) ], | |
| [ 19.62, b4(0.14, 55) ], | |
| [ 19.59, d5(0.26, 70) ], | |
| [ 20.53, as4(0.15, 67) ], | |
| [ 20.55, d5(0.14, 67) ], | |
| [ 21.32, d5(0.05, 69) ], | |
| [ 21.31, as4(0.10, 68) ], | |
| [ 22.03, c5(0.13, 75) ], | |
| [ 22.05, f5(0.15, 72) ], | |
| [ 22.49, c5(0.15, 78) ], | |
| [ 22.51, f5(0.17, 75) ], | |
| [ 23.02, c5(0.15, 69) ], | |
| [ 23.02, e5(0.19, 72) ], | |
| [ 23.54, c5(0.15, 75) ], | |
| [ 23.54, e5(0.17, 53) ], | |
| [ 24.01, d5(0.17, 72) ], | |
| [ 24.04, a4(0.17, 78) ], | |
| [ 25.06, d5(0.14, 49) ], | |
| [ 25.03, a4(0.17, 60) ], | |
| [ 25.95, c5(0.79, 65) ], | |
| [ 25.94, g4(0.88, 73) ], | |
| [ 26.82, a4(0.04, 74) ], | |
| [ 26.81, d5(0.13, 72) ], | |
| [ 27.54, d5(0.15, 68) ], | |
| [ 28.50, as4(0.17, 64) ], | |
| [ 28.52, d5(0.15, 65) ], | |
| [ 29.27, as4(0.12, 68) ], | |
| [ 29.31, d5(0.11, 67) ], | |
| [ 30.00, c5(0.14, 74) ], | |
| [ 30.01, f5(0.17, 73) ], | |
| [ 30.46, c5(0.14, 78) ], | |
| [ 30.48, f5(0.16, 75) ], | |
| [ 31.00, g5(0.44, 68) ]].quantize(4)); | |
| } | |
| function crazybass1() { | |
| createTrack(5).play([[ 0.06, d2(0.63, 88) ], | |
| [ 1.00, d2(0.70, 88) ], | |
| [ 2.02, d2(0.71, 92) ], | |
| [ 3.05, d2(0.73, 98) ], | |
| [ 4.02, g2(0.66, 90) ], | |
| [ 5.00, g2(0.71, 94) ], | |
| [ 6.01, a2(0.70, 100) ], | |
| [ 7.02, c3(0.30, 95) ], | |
| [ 7.55, d3(0.38, 100) ]].quantize(4)); | |
| } | |
| crazypiano(); | |
| crazybrass(); | |
| for(var n=0;n<2;n++) { | |
| crazybass1(); | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],,fs5(1/8,50),fs5(1/8,10), | |
| [c5(1/8,80),fs5],,fs5(1/8,50),, | |
| ].repeat(3)); | |
| } | |
| for(var n=0;n<2;n++) { | |
| crazybass1(); | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],,fs5(1/8,50),fs5(1/8,10), | |
| [d5,c5(1/8,80),fs5],,fs5(1/8,50),, | |
| ].repeat(n === 1 ? 2: 3)); | |
| if (n===1) { | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],d5(1/8,30),fs5(1/8,50),[d5(1/8,40), fs5(1/8,10)], | |
| [d5,c5(1/8,80),fs5],d5(1/8,40),fs5(1/8,10),d5(1/16,50), | |
| ]); | |
| } | |
| } | |
| crazypiano(); | |
| crazybase(); | |
| crazybrass(); | |
| crazyguitar1(); | |
| for(var n=0;n<4;n++) { | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],,fs5(1/8,50),fs5(1/8,10), | |
| [d5,c5(1/8,80),fs5],,fs5(1/8,50),, | |
| ].repeat(n === 3 ? 2: 3)); | |
| if (n===1) { | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],d5(1/8,30),fs5(1/8,50),[d5(1/8,40), fs5(1/8,10)], | |
| [d5,c5(1/8,80),fs5],d5(1/8,40),fs5(1/8,10),d5(1/16,50), | |
| ]); | |
| } | |
| } | |
| crazypiano(); | |
| crazybase(); | |
| crazybrass(); | |
| createTrack(4).play([[ 2.54, a4(0.37, 88) ], | |
| [ 2.98, d5(0.50, 83) ], | |
| [ 3.47, e5(0.10, 59) ], | |
| [ 3.74, e5(0.18, 75) ], | |
| [ 3.93, f5(1.55, 69) ], | |
| [ 5.45, fs5(0.05, 70) ], | |
| [ 5.53, g5(0.47, 71) ], | |
| [ 6.03, f5(0.47, 68) ], | |
| [ 6.50, e5(0.28, 78) ], | |
| [ 7.02, d5(0.42, 70) ], | |
| [ 7.49, c5(0.15, 68) ], | |
| [ 7.77, a4(2.48, 70) ], | |
| [ 10.50, a4(0.51, 67) ], | |
| [ 11.03, d5(0.47, 70) ], | |
| [ 11.49, e5(0.15, 55) ], | |
| [ 11.80, e5(0.14, 82) ], | |
| [ 11.90, f5(0.86, 60) ], | |
| [ 13.00, g5(0.47, 70) ], | |
| [ 13.94, gs5(0.10, 71) ], | |
| [ 14.05, a5(0.66, 68) ], | |
| [ 14.84, c6(0.64, 65) ], | |
| [ 15.45, gs5(0.04, 59) ], | |
| [ 15.54, a5(2.72, 73) ], | |
| [ 18.56, a4(0.20, 74) ], | |
| [ 19.04, d5(0.45, 72) ], | |
| [ 19.49, e5(0.15, 57) ], | |
| [ 19.80, e5(0.14, 74) ], | |
| [ 19.89, f5(1.34, 63) ], | |
| [ 21.38, f5(0.07, 2) ], | |
| [ 21.42, fs5(0.08, 74) ], | |
| [ 21.49, g5(0.44, 72) ], | |
| [ 22.04, f5(0.40, 74) ], | |
| [ 22.53, e5(0.17, 62) ], | |
| [ 23.02, d5(0.38, 72) ], | |
| [ 23.50, c5(0.18, 58) ], | |
| [ 23.79, d5(1.76, 67) ], | |
| [ 25.54, f5(0.12, 70) ], | |
| [ 26.01, g5(0.36, 72) ], | |
| [ 26.72, g5(0.05, 58) ], | |
| [ 26.77, gs5(0.14, 72) ], | |
| [ 26.88, a5(0.57, 69) ], | |
| [ 27.53, c6(0.14, 68) ], | |
| [ 28.05, cs6(0.03, 63) ], | |
| [ 28.01, c6(0.13, 53) ], | |
| [ 28.11, d6(0.24, 50) ], | |
| [ 28.47, c6(0.41, 54) ], | |
| [ 29.02, a5(0.21, 65) ], | |
| [ 29.53, gs5(0.23, 72) ], | |
| [ 30.02, g5(0.27, 77) ], | |
| [ 30.32, f5(0.14, 78) ], | |
| [ 30.82, d5(0.23, 70) ], | |
| [ 31.33, c5(0.17, 74) ]]); | |
| for(var n=0;n<4;n++) { | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],,fs5(1/8,50),fs5(1/8,10), | |
| [d5,c5(1/8,80),fs5],,fs5(1/8,50),, | |
| ].repeat(n === 3 ? 2: 3)); | |
| if (n===3) { | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],d5(1/8,30),fs5(1/8,50),[d5(1/8,40), fs5(1/8,10)], | |
| [d5,c5(1/8,80),fs5],d5(1/8,40),fs5(1/8,10),d5(1/16,50), | |
| ]); | |
| } | |
| } | |
| crazypiano(); | |
| createTrack(1).play([[ 0.07, a4(3.84, 55) ], | |
| [ 0.07, d5(6.02, 48) ], | |
| [ 4.00, f5(2.11, 57) ], | |
| [ 6.08, e5(1.90, 54) ], | |
| [ 6.09, c5(1.92, 48) ], | |
| [ 8.06, a4(3.88, 49) ], | |
| [ 12.00, f5(1.91, 59) ], | |
| [ 8.03, d5(5.95, 54) ], | |
| [ 13.98, e5(2.02, 49) ], | |
| [ 14.01, g5(1.99, 58) ], | |
| [ 16.02, f5(1.90, 53) ], | |
| [ 17.95, e5(1.99, 53) ], | |
| [ 16.11, a5(5.82, 72) ], | |
| [ 21.94, g5(2.04, 75) ], | |
| [ 24.03, a5(2.00, 62) ], | |
| [ 26.06, c6(1.93, 63) ], | |
| [ 19.95, d5(8.10, 44) ], | |
| [ 28.04, d6(1.99, 58) ], | |
| [ 30.00, c6(1.91, 68) ], | |
| [ 28.01, g5(3.92, 65) ]]); | |
| for(var n=0;n<4;n++) { | |
| crazybass1(); | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],,fs5(1/8,50),fs5(1/8,10), | |
| [d5,c5(1/8,80),fs5],,fs5(1/8,50),, | |
| ].repeat(n === 3 ? 2: 3)); | |
| if (n===3) { | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],d5(1/8,30),fs5(1/8,50),[d5(1/8,40), fs5(1/8,10)], | |
| [d5,c5(1/8,80),fs5],d5(1/8,40),fs5(1/8,10),d5(1/16,50), | |
| ]); | |
| } | |
| } | |
| await part2(); | |
| crazybase(); | |
| createTrack(1).play([[ 0.01, d6(6.13, 59) ], | |
| [ 0.01, a5(8.02, 60) ], | |
| [ 6.11, e6(1.95, 88) ], | |
| [ 8.04, g5(8.04, 67) ], | |
| [ 8.03, c6(8.05, 72) ], | |
| [ 16.07, e5(3.95, 62) ], | |
| [ 20.03, f5(1.93, 77) ], | |
| [ 21.96, e5(2.07, 55) ], | |
| [ 16.07, a5(9.93, 74) ], | |
| [ 25.99, g5(3.95, 68) ]]); | |
| for(var n=0;n<4;n++) { | |
| createTrack(0).play([[ 0.51, e5(0.33, 75) ], | |
| [ 0.50, g4(0.34, 93) ], | |
| [ 0.49, c5(0.38, 90) ], | |
| [ 1.24, g4(0.27, 94) ], | |
| [ 1.24, c5(0.30, 87) ], | |
| [ 1.25, e5(0.31, 79) ], | |
| [ 1.98, g4(0.44, 95) ], | |
| [ 2.01, c5(0.48, 92) ], | |
| [ 1.98, e5(0.53, 79) ], | |
| [ 2.79, c5(0.27, 74) ], | |
| [ 2.80, a4(0.27, 98) ], | |
| [ 2.80, f5(0.33, 89) ], | |
| [ 3.56, f4(0.43, 79) ], | |
| [ 3.56, d5(0.46, 77) ], | |
| [ 3.54, as4(0.48, 77) ], | |
| [ 4.53, f4(0.31, 83) ], | |
| [ 4.52, as4(0.36, 92) ], | |
| [ 4.53, d5(0.35, 82) ], | |
| [ 5.29, f4(0.23, 87) ], | |
| [ 5.29, as4(0.27, 82) ], | |
| [ 5.32, d5(0.26, 72) ], | |
| [ 6.04, g4(0.45, 100) ], | |
| [ 6.05, f5(0.47, 89) ], | |
| [ 6.04, c5(0.51, 94) ], | |
| [ 6.81, g4(0.35, 89) ], | |
| [ 6.79, c5(0.40, 68) ], | |
| [ 6.81, e5(0.38, 74) ], | |
| [ 7.56, g4(0.37, 94) ], | |
| [ 7.55, c5(0.38, 89) ], | |
| [ 7.57, e5(0.38, 77) ]].quantize(4)); | |
| createTrack(3).play([[ 0.51, c5(0.09, 87) ], | |
| [ 0.51, c6(0.11, 87) ], | |
| [ 0.77, c5(0.27, 94) ], | |
| [ 0.79, c6(0.28, 103) ], | |
| [ 1.45, d5(0.47, 94) ], | |
| [ 1.48, d6(0.47, 98) ], | |
| [ 2.53, c6(0.05, 87) ], | |
| [ 2.55, c5(0.03, 79) ], | |
| [ 2.79, c5(0.30, 93) ], | |
| [ 2.80, c6(0.33, 99) ], | |
| [ 3.53, d5(0.50, 99) ], | |
| [ 3.56, d6(0.49, 105) ], | |
| [ 4.55, c5(0.33, 112) ], | |
| [ 4.55, c6(0.35, 110) ], | |
| [ 5.32, d5(0.20, 100) ], | |
| [ 5.32, d6(0.26, 104) ], | |
| [ 6.01, f5(0.44, 100) ], | |
| [ 6.01, f6(0.44, 105) ], | |
| [ 6.83, e6(0.33, 107) ], | |
| [ 6.83, e5(0.33, 97) ], | |
| [ 7.59, c5(0.38, 104) ], | |
| [ 7.59, c6(0.39, 108) ]].quantize(4)); | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],,fs5(1/8,50),fs5(1/8,10), | |
| [c5(1/8,80),fs5],,fs5(1/8,50),, | |
| ].repeat(3)); | |
| } | |
| await createTrack(2).steps(4, [ | |
| [c5(1/8,80),fs5],,fs5(1/8,50),, | |
| ,,,, | |
| ,,,, | |
| ,,,,c5(1,1) | |
| ]); | |
| loopHere(); | 
  
    
      This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
      Learn more about bidirectional Unicode characters
    
  
  
    
  | /* | |
| * (c) Peter Johan Salomonsen 2020 | |
| */ | |
| import { cos, outputline, FFT, EQBand, TriBandEQ, Pan, SineOscillator, IFFTOscillator, BiQuadFilter, FilterType, Q_BUTTERWORTH, Noise, DelayLine, BandPass,SawOscillator,softclip, midichannels, MidiChannel, MidiVoice, StereoSignal, Freeverb, SineOscillator, Envelope, notefreq } from '../mixes/globalimports'; | |
| import { SAMPLERATE } from '../environment'; | |
| export class AllPass { | |
| coeff: f32; | |
| previousinput: f32; | |
| previousoutput: f32; | |
| setDelta(delta: f32): void { | |
| this.coeff = (1 - delta) / (1 + delta); | |
| } | |
| process(input: f32): f32 { | |
| const output = this.coeff * (input | |
| - this.previousoutput) | |
| + this.previousinput; | |
| this.previousoutput = output; | |
| this.previousinput = input; | |
| return output; | |
| } | |
| } | |
| export class DelayLineFloat { | |
| buffer: StaticArray<f32>; | |
| frame: f64 = 0; | |
| numframes: f64 = 1; | |
| previous: f32; | |
| allpass: AllPass = new AllPass(); | |
| constructor(private buffersizeframes: i32) { | |
| this.buffer = new StaticArray<f32>(buffersizeframes); | |
| } | |
| read(): f32 { | |
| const index = this.frame as i32 % this.buffer.length; | |
| return this.allpass.process(this.buffer[index]); | |
| //return this.buffer[index]; | |
| } | |
| setNumFramesAndClear(numframes: f64): void { | |
| this.numframes = Math.floor(numframes); | |
| this.allpass.setDelta ( (numframes - this.numframes) as f32 ); | |
| } | |
| write_and_advance(value: f32): void { | |
| //const index = Math.round((this.frame++) + this.numframes) as i32 % this.buffer.length; | |
| const index = ((this.frame++) + this.numframes) as i32 % this.buffer.length; | |
| this.buffer[index] = value; | |
| } | |
| } | |
| class OnePole { | |
| a0: f32 = 1.0; | |
| b1: f32 = 0.0; | |
| z1: f32 = 0.0; | |
| lopass(fc: f32): void { | |
| this.b1 = Mathf.exp(-2.0 * Mathf.PI * fc / SAMPLERATE); | |
| this.a0 = 1.0 - this.b1; | |
| } | |
| hipass(fc: f32): void { | |
| this.b1 = -Mathf.exp(-2.0 * Mathf.PI * (0.5 - (fc / SAMPLERATE))); | |
| this.a0 = 1.0 + this.b1; | |
| } | |
| process(val: f32): f32 { | |
| this.z1 = val * this.a0 + this.z1 * this.b1; | |
| return this.z1; | |
| } | |
| } | |
| class WaveGuide { | |
| exciter: Noise = new Noise(); | |
| envExciter: Envelope; | |
| filterExciter: OnePole; | |
| delay: DelayLineFloat = new DelayLineFloat((SAMPLERATE / notefreq(1)) as i32); | |
| delay2: DelayLineFloat = new DelayLineFloat((SAMPLERATE / notefreq(1)) as i32); | |
| filterFeedback: OnePole; | |
| feedbackLevel: f32; | |
| feedbackFilterFreq: f32; | |
| constructor(exciterAttack: f32, exciterRelease: f32, exciterFilterFreq : f32, feedbackLevel: f32) { | |
| this.envExciter = new Envelope(exciterAttack, | |
| exciterRelease, 0, | |
| exciterRelease); | |
| this.filterExciter = new OnePole(); | |
| this.filterExciter.lopass(exciterFilterFreq) | |
| this.filterFeedback = new OnePole(); | |
| this.feedbackLevel = feedbackLevel; | |
| } | |
| start(freq: f32, feedbackFilterFreq: f32): void { | |
| const tmpDelay = this.delay; | |
| this.delay = this.delay2; | |
| this.delay2 = tmpDelay; | |
| this.filterFeedback.lopass(feedbackFilterFreq); | |
| this.feedbackFilterFreq = feedbackFilterFreq; | |
| this.delay.setNumFramesAndClear( | |
| (SAMPLERATE / | |
| (freq) | |
| ) | |
| ); | |
| this.envExciter.val = 0; | |
| this.envExciter.attack(); | |
| } | |
| stop(): void { | |
| this.delay.setNumFramesAndClear(1); | |
| this.delay2.setNumFramesAndClear(1); | |
| } | |
| process(): f32 { | |
| const envexciter = this.envExciter.next(); | |
| let exciterSignal = this.exciter.next() * envexciter; | |
| exciterSignal = this.filterExciter.process(exciterSignal); | |
| const feedback = this.delay.read(); | |
| let signal = exciterSignal + feedback; | |
| signal = this.filterFeedback.process(signal); | |
| this.delay.write_and_advance( | |
| signal * this.feedbackLevel | |
| ); | |
| const delay2 = this.delay2.read(); | |
| this.delay2.write_and_advance(delay2 * 0.9); | |
| return signal + delay2; | |
| } | |
| } | |
| class Piano extends MidiVoice { | |
| env: Envelope = new Envelope(0.01, 1, 1.0, 0.1); | |
| waveguide1: WaveGuide = new WaveGuide(0.06, 0.25, 50, 0.9999); | |
| waveguide2: WaveGuide = new WaveGuide(0.01, 0.1, 100, 0.999); | |
| waveguide3: WaveGuide = new WaveGuide(0.02, 0.05,150, 0.99); | |
| noteon(note: u8, velocity: u8): void { | |
| super.noteon(note, velocity); | |
| const freq = notefreq(note); | |
| this.waveguide1.start(freq, freq * 6000 / (Mathf.pow(note, 1.35) )); | |
| this.waveguide2.start(freq , freq * 4000 / (Mathf.pow(note, 1.3) )); | |
| this.waveguide3.start(freq , freq * 2000 / (Mathf.pow(note, 1.3) )); | |
| this.env.attack(); | |
| } | |
| noteoff(): void { | |
| this.env.release(); | |
| } | |
| isDone(): boolean { | |
| const ret = this.env.isDone(); | |
| if(ret) { | |
| this.waveguide1.stop(); | |
| this.waveguide2.stop(); | |
| this.waveguide3.stop(); | |
| } | |
| return ret; | |
| } | |
| nextframe(): void { | |
| const env = this.env.next(); | |
| const wg1: f32 = this.waveguide1.process(); | |
| const wg2: f32 = this.waveguide2.process(); | |
| const wg3: f32 = this.waveguide3.process(); | |
| const velocity = env * this.velocity / 8; | |
| this.channel.signal.add( | |
| (wg1 + wg2 * 0.8 + wg3) * velocity , | |
| (wg1 + wg2 + wg3 * 0.8) * velocity | |
| ); | |
| } | |
| } | |
| class String extends MidiVoice { | |
| env: Envelope = new Envelope(0.1, 1, 0.9, 0.3); | |
| waveguide1: WaveGuide = new WaveGuide(0.2, 20.0, 100, 0.995); | |
| noteon(note: u8, velocity: u8): void { | |
| super.noteon(note, velocity); | |
| const freq = notefreq(note); | |
| this.waveguide1.start(freq, freq * 3500 / Mathf.pow(note, 1.3) ); | |
| this.env.attack(); | |
| } | |
| noteoff(): void { | |
| this.env.release(); | |
| } | |
| isDone(): boolean { | |
| const ret = this.env.isDone(); | |
| if(ret) { | |
| this.waveguide1.stop(); | |
| } | |
| return ret; | |
| } | |
| nextframe(): void { | |
| const env = this.env.next(); | |
| const signal = ( | |
| this.waveguide1.process() | |
| ) | |
| * env * this.velocity / 8 as f32; | |
| this.channel.signal.add( | |
| signal, signal | |
| ); | |
| } | |
| } | |
| class Brass extends MidiVoice { | |
| env: Envelope = new Envelope(0.01, 1.0, 1.0, 0.1); | |
| waveguide1: WaveGuide = new WaveGuide(0.02, 0.15, 1000, 0.99999); | |
| waveguide2: WaveGuide = new WaveGuide(0.03, 0.2, 5000, 1.0); | |
| noteon(note: u8, velocity: u8): void { | |
| super.noteon(note, velocity); | |
| const freq = notefreq(note); | |
| this.waveguide1.start(freq, freq * 10); | |
| this.waveguide2.start(freq, freq * 8); | |
| this.env.attack(); | |
| } | |
| noteoff(): void { | |
| this.env.release(); | |
| } | |
| isDone(): boolean { | |
| const ret = this.env.isDone(); | |
| if(ret) { | |
| this.waveguide1.stop(); | |
| this.waveguide2.stop(); | |
| } | |
| return ret; | |
| } | |
| nextframe(): void { | |
| const env = this.env.next(); | |
| let signal = ( | |
| this.waveguide1.process() + | |
| this.waveguide2.process() | |
| ) | |
| * env * this.velocity / 24 as f32; | |
| this.channel.signal.add( | |
| signal, signal | |
| ); | |
| } | |
| } | |
| class Guitar extends MidiVoice { | |
| env: Envelope = new Envelope(0.02, 1, 1.0, 0.1); | |
| waveguide1: WaveGuide = new WaveGuide(0.005, 0.01, 3000, 0.9999); | |
| noteon(note: u8, velocity: u8): void { | |
| super.noteon(note, velocity); | |
| const freq = notefreq(note); | |
| this.waveguide1.start(freq, freq * 3500 / Mathf.pow(note, 1.3) ); | |
| this.env.attack(); | |
| } | |
| noteoff(): void { | |
| this.env.release(); | |
| } | |
| isDone(): boolean { | |
| const ret = this.env.isDone(); | |
| if(ret) { | |
| this.waveguide1.stop(); | |
| } | |
| return ret; | |
| } | |
| nextframe(): void { | |
| const env = this.env.next(); | |
| const signal = ( | |
| this.waveguide1.process() | |
| ) | |
| * env * this.velocity / 8 as f32; | |
| this.channel.signal.add( | |
| signal, signal | |
| ); | |
| } | |
| } | |
| class GuitarChannel extends MidiChannel { | |
| feedback: f32 = 0; | |
| bpfilter: BandPass = new BandPass(40, 8000); | |
| preprocess(): void { | |
| let signal = this.signal.left; | |
| const feedback = this.feedback; | |
| signal = softclip(signal * 0.2); | |
| this.feedback = this.bpfilter.process(feedback * 0.92 + signal); | |
| signal += feedback; | |
| this.signal.left = signal; | |
| this.signal.right = signal; | |
| } | |
| } | |
| class Bass extends MidiVoice { | |
| env: Envelope = new Envelope(0.1, 1, 1.0, 0.1); | |
| waveguide1: WaveGuide = new WaveGuide(0.04, 0.01, 300, 0.999999); | |
| noteon(note: u8, velocity: u8): void { | |
| super.noteon(note, velocity); | |
| const freq = notefreq(note); | |
| this.waveguide1.start(freq, freq * 7); | |
| this.env.attack(); | |
| } | |
| noteoff(): void { | |
| this.env.release(); | |
| } | |
| isDone(): boolean { | |
| const ret = this.env.isDone(); | |
| if(ret) { | |
| this.waveguide1.stop(); | |
| } | |
| return ret; | |
| } | |
| nextframe(): void { | |
| const env = this.env.next(); | |
| const signal = ( | |
| this.waveguide1.process() | |
| ) | |
| * env * this.velocity / 2 as f32; | |
| this.channel.signal.add( | |
| signal, signal | |
| ); | |
| } | |
| } | |
| export class Hihat extends MidiVoice { | |
| private velocity: f32; | |
| readonly envelope: Envelope = new Envelope(0.0, 0.07, 0, 0.1); | |
| readonly noise: Noise = new Noise(); | |
| readonly filter: BiQuadFilter = new BiQuadFilter(); | |
| readonly signal: StereoSignal = new StereoSignal(); | |
| constructor(channel: MidiChannel) { | |
| super(channel); | |
| this.minnote = 66; | |
| this.maxnote = 66; | |
| } | |
| noteon(note: u8, velocity: u8):void { | |
| if(note > 1) { | |
| this.velocity = velocity as f32 / 32; | |
| this.envelope.attack(); | |
| } | |
| } | |
| noteoff(): void { | |
| this.envelope.release(); | |
| } | |
| isDone(): boolean { | |
| return this.envelope.isDone(); | |
| } | |
| nextframe(): void { | |
| let env: f32 = this.envelope.next(); | |
| let osc: f32 = this.noise.next(); | |
| let signal = this.velocity * 1.2 * env * osc; | |
| this.filter.update_coeffecients(FilterType.HighPass, SAMPLERATE, | |
| 10000 + 2000 * env, Q_BUTTERWORTH); | |
| signal = this.filter.process(signal); | |
| this.channel.signal.add(signal, signal); | |
| } | |
| } | |
| export class Kick2 extends MidiVoice { | |
| private velocity: f32; | |
| readonly noise: Noise = new Noise(); | |
| readonly env2: Envelope = new Envelope(0.001, 0.01, 0.0, 0.01); | |
| readonly bp2: BandPass = new BandPass(4000, 5000); | |
| readonly env3: Envelope = new Envelope(0.001, 0.3, 0.0, 0.1); | |
| readonly bp3: BandPass = new BandPass(10, 100); | |
| constructor(channel: MidiChannel) { | |
| super(channel); | |
| this.minnote = 60; | |
| this.maxnote = 60; | |
| } | |
| noteon(note: u8, velocity: u8): void { | |
| super.noteon(note, velocity); | |
| this.velocity = (velocity as f32) / 40; | |
| this.env2.attack(); | |
| this.env3.attack(); | |
| } | |
| noteoff(): void { | |
| this.env2.release(); | |
| this.env3.release(); | |
| } | |
| isDone(): boolean { | |
| return this.env3.isDone(); | |
| } | |
| nextframe(): void { | |
| let env2: f32 = this.env2.next(); | |
| let env3: f32 = this.env3.next(); | |
| const osc: f32 = this.noise.next(); | |
| this.bp3.update_frequencies(10, 11 + env3 * 80); | |
| const sig = this.velocity * ( | |
| this.bp2.process(osc) * env2 + | |
| this.bp3.process(osc) * env3 * 30); | |
| this.channel.signal.add(sig, sig); | |
| } | |
| } | |
| export class Snare2 extends MidiVoice { | |
| private velocity: f32; | |
| readonly noise: Noise = new Noise(); | |
| readonly env1: Envelope = new Envelope(0.001, 0.3, 0.0, 0.3); | |
| readonly bp1: BandPass = new BandPass(350, 500); | |
| readonly env2: Envelope = new Envelope(0.001, 0.08, 0.00, 0.2); | |
| readonly bp2: BandPass = new BandPass(3000, 5000); | |
| constructor(channel: MidiChannel) { | |
| super(channel); | |
| this.minnote = 62; | |
| this.maxnote = 62; | |
| } | |
| noteon(note: u8, velocity: u8): void { | |
| super.noteon(note, velocity); | |
| this.velocity = velocity as f32 / 64; | |
| this.env1.attack(); | |
| this.env2.attack(); | |
| } | |
| noteoff(): void { | |
| this.env1.release(); | |
| this.env2.release(); | |
| } | |
| isDone(): boolean { | |
| return this.env1.isDone(); | |
| } | |
| nextframe(): void { | |
| let env1: f32 = this.env1.next(); | |
| let env2: f32 = this.env2.next(); | |
| let osc: f32 = this.noise.next(); | |
| let sig1 = this.bp1.process(osc) * env1 * 7; | |
| let sig2 = this.bp2.process(osc) * env2 * 2; | |
| this.channel.signal.add( | |
| this.velocity * (sig1 + sig2 * 0.7), | |
| this.velocity * (sig1 * 0.7 + sig2) | |
| ); | |
| } | |
| } | |
| export function initializeMidiSynth(): void { | |
| midichannels[0] = new MidiChannel(10, (ch) => new Piano(ch)); | |
| midichannels[0].controlchange(7, 95); | |
| midichannels[0].controlchange(10, 75); | |
| midichannels[0].controlchange(91, 50); | |
| midichannels[1] = new MidiChannel(8, (ch) => new String(ch)); | |
| midichannels[1].controlchange(7, 70); | |
| midichannels[1].controlchange(10, 50); | |
| midichannels[1].controlchange(91, 50); | |
| midichannels[2] = new MidiChannel(3, (ch, ndx) => { | |
| switch(ndx) { | |
| case 1: | |
| return new Hihat(ch); | |
| case 2: | |
| return new Snare2(ch); | |
| default: | |
| return new Kick2(ch); | |
| } | |
| }); | |
| midichannels[2].controlchange(7, 100); | |
| midichannels[2].controlchange(91, 20); | |
| midichannels[3] = new MidiChannel(4, (ch) => new Brass(ch)); | |
| midichannels[3].controlchange(7, 52); | |
| midichannels[3].controlchange(10, 50); | |
| midichannels[3].controlchange(91, 30); | |
| midichannels[4] = new GuitarChannel(10, (ch) => new Guitar(ch)); | |
| midichannels[4].controlchange(7, 85); | |
| midichannels[4].controlchange(10, 45); | |
| midichannels[4].controlchange(91, 55); | |
| midichannels[5] = new MidiChannel(2, (ch) => new Bass(ch)); | |
| midichannels[5].controlchange(7, 105); | |
| midichannels[5].controlchange(10, 70); | |
| midichannels[5].controlchange(91, 20); | |
| } | |
| export class MultiBandEQ { | |
| bands: StaticArray<EQBand>; | |
| constructor(freqs: f32[]) { | |
| this.bands = new StaticArray<EQBand>(freqs.length - 1); | |
| for ( let n=1; n<freqs.length; n++) { | |
| this.bands[n-1] = new EQBand(freqs[n-1], freqs[n]); | |
| } | |
| } | |
| process(signal: f32, levels: f32[]): f32 { | |
| let ret: f32 = 0; | |
| for (let n = 0;n<this.bands.length; n++) { | |
| ret += this.bands[n].process(signal) * levels[n]; | |
| } | |
| return ret; | |
| } | |
| } | |
| const eqfreqs: f32[] = [20,70,250,12000,19000] | |
| const eqlevels: f32[] = [0.8, 1.0, 0.8, 0.7]; | |
| //const eqlevels: f32[] = [1.0, 1.0, 1.0, 1.0]; | |
| const eqleft = new MultiBandEQ(eqfreqs); | |
| const eqright = new MultiBandEQ(eqfreqs); | |
| export function postprocess(): void { | |
| const gain: f32 = 0.37; | |
| let left = outputline.left; | |
| let right = outputline.right; | |
| left*=gain; | |
| right*=gain; | |
| // stereo enhancement | |
| left += (left - right) * 0.15; | |
| right += (right - left) * 0.15; | |
| left = eqleft.process(left, eqlevels); | |
| right = eqright.process(right, eqlevels); | |
| outputline.left = left; | |
| outputline.right = right; | |
| } | 
  
    Sign up for free
    to join this conversation on GitHub.
    Already have an account?
    Sign in to comment