retrokits

RK002 Arpeggio extended

Jun 15th, 2022 (edited)
1,168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. /* DUY Code: ARP Arpeggio example */
  2.  
  3. /*
  4.  * Example script of RK002 arpeggiator.
  5.  *
  6.  * PARAMETERS (accessible via DUY Portal or SysEx without compiling)
  7.  * MIDICHN    : working input MIDI channel  (1..16)
  8.  * MODE       : 0=off, 1=UP, 2=DOWN, 3=ALTERNATE, 4=RANDOM, 5=AS_PLAYED
  9.  * OCTAVE_MIN : range min 0-4
  10.  * OCTAVE_MAX : range max 0-4
  11.  * CLOCKLENGTH: ARP clock length 1-48
  12.  * GATE       : gate length: 1=1/4, 2=2/4, 3=3/4, 4=1, 5=5/4 etc.
  13.  * TRANSPOSE  : ARP transpose 0-36
  14.  */
  15.  
  16. RK002_DECLARE_PARAM(MIDICHN,1,1,16,1);
  17.  
  18. // MODE: 0=off, 1=UP, 2=DOWN, 3=ALTERNATE, 4=RANDOM, 5=AS_PLAYED
  19. RK002_DECLARE_PARAM(MODE,0,0,5,1);
  20.  
  21. RK002_DECLARE_PARAM(OCTAVE_MIN,0,-4,0,0);
  22. RK002_DECLARE_PARAM(OCTAVE_MAX,0,0,4,0);
  23. RK002_DECLARE_PARAM(CLOCKLENGTH,0,1,48,2);
  24.  
  25. // GATE: 1=1/4, 2=2/4, 3=3/4, 4=1, 5=5/4 etc.
  26. RK002_DECLARE_PARAM(GATE,0,1,16,2);
  27.  
  28. RK002_DECLARE_PARAM(TRANSPOSE,0,0,36,0);
  29.  
  30. RKArp arp;
  31. byte midichn = 0;
  32.  
  33. void updateParams()
  34. {
  35.   midichn = RK002_paramGet(MIDICHN) - 1;
  36.   arp.setMode(RK002_paramGet(MODE));
  37.   /*
  38.     ARPMODE_OFF,
  39.     ARPMODE_UP,
  40.     ARPMODE_DOWN,
  41.     ARPMODE_ALTERNATE,
  42.     ARPMODE_RANDOM,
  43.     ARPMODE_AS_PLAYED,
  44.   */
  45.   arp.setOctaveMin(RK002_paramGet(OCTAVE_MIN));
  46.   arp.setOctaveMax(RK002_paramGet(OCTAVE_MAX));
  47.   arp.setClockLength(RK002_paramGet(CLOCKLENGTH));
  48.   arp.setTranspose(RK002_paramGet(TRANSPOSE));
  49. }
  50.  
  51. void RK002_onParamChange(unsigned param_nr, int param_val)
  52. {
  53.   updateParams();
  54. }
  55.  
  56. bool RK002_onNoteOff(byte chn, byte note, byte velocity)
  57. {
  58.   bool thru = true;
  59.   if (chn == midichn)
  60.   {
  61.     arp.inputNote(note,0); // velo 0 = note off
  62.     thru=false;
  63.   }
  64.   return thru;
  65. }
  66.  
  67. bool RK002_onNoteOn(byte chn, byte note, byte velocity)
  68. {
  69.   bool thru = true;
  70.   if (chn == midichn)
  71.   {
  72.     arp.inputNote(note,velocity);
  73.     thru=false;
  74.   }
  75.   return thru;
  76. }
  77.  
  78.  
  79. bool RK002_onClock()
  80. {
  81.   arp.inputClock();
  82.   return true;
  83. }
  84.  
  85. void onArpOutput(void *userarg, byte key, byte vel)
  86. {
  87.   if(!vel){
  88.     RK002_sendNoteOff(midichn,key,100);
  89.   }else{
  90.     RK002_sendNoteOn(midichn,key,vel);
  91.   }
  92. }
  93.  
  94. bool RK002_onControlChange(byte chn,byte number,byte value){
  95.   bool retval=true;
  96.   if(chn==midichn){
  97.    if(number== 70){
  98.      arp.setMode(value/25); // // MODE: 0=off, 1=UP, 2=DOWN, 3=ALTERNATE, 4=RANDOM, 5=AS_PLAYED
  99.    }
  100.    if(number== 71){
  101.      arp.setGateCode((value/8)+1);
  102.    }
  103.    if(number== 72){
  104.      arp.setClockLength((value/3)+1);
  105.    }
  106.    if(number== 73){
  107.      arp.setTranspose(((value-64)/16));
  108.    }
  109.    if(number== 74){
  110.      arp.setOctaveMin(value/32);
  111.    }
  112.    if(number== 75){
  113.      arp.setOctaveMax(value/32);
  114.    }
  115.    if(number== 76){
  116.      arp.setHold(value/127);
  117.    }
  118.    //retval= false; //mute original cc?
  119.   }
  120.   if(number==123) return false; // mute always.
  121.   return retval;
  122. }
  123.  
  124. void setup()
  125. {
  126.   RK002_clockSetMode(0);// 0=auto clock, 1=only internal, 2=only external
  127.   updateParams();
  128.   arp.setOutputHandler(onArpOutput,0);
  129. }
  130.  
  131. void loop()
  132. {
  133. }
Add Comment
Please, Sign In to add comment