Advertisement
retrokits

arp with channel select out

Jul 12th, 2022
1,199
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. byte midioutchn = 0;
  33.  
  34. void updateParams()
  35. {
  36.   midichn = RK002_paramGet(MIDICHN) - 1;
  37.   arp.setMode(RK002_paramGet(MODE));
  38.   /*
  39.     ARPMODE_OFF,
  40.     ARPMODE_UP,
  41.     ARPMODE_DOWN,
  42.     ARPMODE_ALTERNATE,
  43.     ARPMODE_RANDOM,
  44.     ARPMODE_AS_PLAYED,
  45.   */
  46.   arp.setOctaveMin(RK002_paramGet(OCTAVE_MIN));
  47.   arp.setOctaveMax(RK002_paramGet(OCTAVE_MAX));
  48.   arp.setClockLength(RK002_paramGet(CLOCKLENGTH));
  49.   arp.setTranspose(RK002_paramGet(TRANSPOSE));
  50. }
  51.  
  52. void RK002_onParamChange(unsigned param_nr, int param_val)
  53. {
  54.   updateParams();
  55. }
  56.  
  57. bool RK002_onNoteOff(byte chn, byte note, byte velocity)
  58. {
  59.   bool thru = true;
  60.   if (chn == midichn)
  61.   {
  62.     arp.inputNote(note,0); // velo 0 = note off
  63.     thru=false;
  64.   }
  65.   return thru;
  66. }
  67.  
  68. bool RK002_onNoteOn(byte chn, byte note, byte velocity)
  69. {
  70.   bool thru = true;
  71.   if (chn == midichn)
  72.   {
  73.     arp.inputNote(note,velocity);
  74.     thru=false;
  75.   }
  76.   return thru;
  77. }
  78.  
  79.  
  80. bool RK002_onClock()
  81. {
  82.   arp.inputClock();
  83.   return true;
  84. }
  85.  
  86. void onArpOutput(void *userarg, byte key, byte vel)
  87. {
  88.   if(!vel){
  89.     RK002_sendNoteOff(midioutchn,key,100);
  90.   }else{
  91.     RK002_sendNoteOn(midioutchn,key,vel);
  92.   }
  93. }
  94.  
  95. bool RK002_onControlChange(byte chn,byte number,byte value){
  96.   bool retval=true;
  97.   if(chn==midichn){
  98.    if(number== 70){
  99.      arp.setMode(value/25); // // MODE: 0=off, 1=UP, 2=DOWN, 3=ALTERNATE, 4=RANDOM, 5=AS_PLAYED
  100.    }
  101.    if(number== 71){
  102.      arp.setGateCode((value/8)+1);
  103.    }
  104.    if(number== 72){
  105.      arp.setClockLength((value/3)+1);
  106.    }
  107.    if(number== 73){
  108.      arp.setTranspose(((value-64)/16));
  109.    }
  110.    if(number== 74){
  111.      arp.setOctaveMin(value/32);
  112.    }
  113.    if(number== 75){
  114.      arp.setOctaveMax(value/32);
  115.    }
  116.    if(number== 76){
  117.      arp.setHold(value/127);
  118.    }
  119.    if(number== 77){
  120.      midioutchn=(value/8)+1;
  121.    }
  122.    //retval= false; //mute original cc?
  123.   }
  124.   if(number==123) return false; // mute always.
  125.   return retval;
  126. }
  127.  
  128. void setup()
  129. {
  130.   RK002_clockSetMode(0);// 0=auto clock, 1=only internal, 2=only external
  131.   updateParams();
  132.   arp.setOutputHandler(onArpOutput,0);
  133. }
  134.  
  135. void loop()
  136. {
  137. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement