Advertisement
Guest User

Reaper DAW's MIDI Transpose JSFX with Octave transpose added

a guest
Jul 12th, 2020
323
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.79 KB | None | 0 0
  1. desc:MIDI Transpose Notes
  2. //tags: MIDI processing
  3. //Octave Transpose added by Fretnoize
  4.  
  5.  
  6. slider1:0<-3,3,1>Transpose Octave
  7. slider2:0<-64,64,1>Transpose Semitones
  8. slider3:1<-16,16,1>Premultiply
  9. slider4:0<0,127,1>Lowest Key (MIDI Note #)
  10. slider5:127<0,127,1>Highest Key (MIDI Note #)
  11.  
  12. // these lines tell Reaper the effect has no audio input/output,
  13. // which enables processing optimizations.
  14. // MIDI-only FX should always have these lines.
  15. in_pin:none
  16. out_pin:none
  17.  
  18. @init
  19.  
  20. notebuf = 0; // 4 entries per open note: orignote, channel, vel, transnote
  21. buflen = 0;
  22.  
  23. last_octave = 0;
  24. last_transpose = 0;
  25. last_mult = 1;
  26. last_samplepos = 0;
  27.  
  28. @slider
  29.  
  30. @block
  31.  
  32. samplepos = play_position*srate;
  33. samplechg = samplepos-last_samplepos;
  34. samplechg < -samplesblock/2.0 || samplechg > samplesblock*3.0/2.0 ?
  35. (
  36. buflen = 0; // clear state on seek
  37. );
  38. last_samplepos = samplepos;
  39.  
  40. slider2|0 != last_transpose || slider3 != last_mult || slider1 != last_octave ?
  41. (
  42. last_transpose = slider2|0;
  43. last_mult = slider3;
  44. last_octave = slider1;
  45. oct_transpose = last_octave * 12;
  46.  
  47. i = 0;
  48. loop
  49. (
  50. buflen,
  51.  
  52. n = notebuf[4*i]|0; // original note
  53. c = notebuf[4*i+1]|0; // channel
  54. v = notebuf[4*i+2]|0; // velocity
  55. t = notebuf[4*i+3]|0; // transposed note
  56.  
  57. midisend(0, $x80|c, t); // clear the sustaining transposed note
  58.  
  59. t = (n*last_mult+last_transpose+last_octave)|0; // new transposed note
  60. t < 0 ? t = 0 : t > 127 ? t = 127;
  61. midisend(0, $x90|c, (v*256)|t); // send the new transposed note
  62. notebuf[4*i+3] = t; // update the buffer
  63.  
  64. i = i+1;
  65. );
  66. );
  67.  
  68. while
  69. (
  70. midirecv(offs, m1, m2) ?
  71. (
  72. s = m1&$xF0;
  73. s == $x90 || s == $x80 ? // note-on or note-off
  74. (
  75. n = m2&$xFF; // original note
  76.  
  77. n >= slider4 && n <= slider5 ?
  78. (
  79. c = m1&$xF; // channel
  80. v = (m2&$xFF00)/256; // velocity
  81. t = (n*last_mult+last_transpose+oct_transpose)|0; // transposed note
  82. t < 0 ? t = 0 : t > 127 ? t = 127;
  83. m2 = m2+t-n; // apply transposition
  84.  
  85. i = -1;
  86. while // look for this note|channel already in the buffer
  87. (
  88. i = i+1;
  89. i < buflen && (notebuf[4*i]|0 != n || notebuf[4*i+1]|0 != c);
  90. );
  91.  
  92. (s == $x90 && v > 0) ? // note-on, add to buffer
  93. (
  94. notebuf[4*i] = n;
  95. notebuf[4*i+1] = c;
  96. notebuf[4*i+2] = v;
  97. notebuf[4*i+3] = t;
  98. i == buflen ? buflen = buflen+1;
  99. )
  100. : // note-off, remove from buffer
  101. (
  102. i < buflen ?
  103. (
  104. memcpy(notebuf+4*i, notebuf+4*(i+1), 4*(buflen-i-1)); // delete the entry
  105. buflen = buflen-1;
  106. );
  107. );
  108. );
  109. );
  110. midisend(offs, m1, m2);
  111. );
  112. );
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement