home *** CD-ROM | disk | FTP | other *** search
/ PC World 2008 February / PCWorld_2008-02_cd.bin / audio-video / reaper / reaper2028-install.exe / Effects / Synthesis / midi_drumseq next >
Text File  |  2007-12-08  |  4KB  |  161 lines

  1. // This effect Copyright (C) 2004 and later Cockos Incorporated
  2. // License: GPL - http://www.gnu.org/licenses/gpl.html
  3. desc:MIDI drum sequencer
  4.  
  5. slider1:-6<-120,6,1>volume (dB)
  6. slider2:/drum_patchsets:patchset_pacific1_adpcm.wav:Patch set
  7. slider3:1<0.1,4,0.05>pitch scaling
  8. slider4:16<1,64,1>max voices
  9. slider5:-24<-120,0,1>gain at 0 velocity (dB)
  10. slider6:60<0,127,1>base note
  11. slider7:0<0,16,1>channel (0=omni)
  12. slider8:0,meter
  13.  
  14. @init
  15. max_voices=128; // allocate enough ram for 128 samples
  16. ext_noinit=1;
  17.  
  18. voxlist=0; 
  19. voxsize=0;
  20. voxentsize=4; // cur position, start position, end position, volume
  21.  
  22. sampleinfotab=voxentsize*max_voices; // list of samples with start/end pos
  23.  
  24. lslider2=-1000;
  25.  
  26. @slider
  27. voxmaxsize=min(max_voices,slider4);
  28.  
  29. midichan=slider7;
  30. midibase=slider6;
  31. zerogain=2^(slider5/6);
  32. vol=2^(slider1/6);
  33. slider3=max(0.1,slider3);
  34. actsize=0|min(min(actsize,slider4),4096);
  35.  
  36. tmp=slider2|0;
  37. lslider2 != tmp ? 
  38. (
  39.   lslider2=tmp;
  40.   pcm_buffer=sampleinfotab+128*2;
  41.   num_samples=0;
  42.   filehandle=file_open(slider2);
  43.   filehandle > 0 ? 
  44.   (
  45.     file_riff(filehandle,spl_nch,spl_srate);
  46.     spl_srate/=srate;
  47.     spl_nch==2 ?
  48.     (  
  49.       numsilent=0;
  50.       pairs=min(file_avail(filehandle),(8*1024*1024 - 65536*2))*0.5;
  51.       inspl=0;
  52.       pos=0;
  53.       sampleinfotab[num_samples*2]=pcm_buffer; 
  54.       loop(pairs,
  55.          file_var(filehandle,l);
  56.          file_var(filehandle,r);
  57.          quiet=max(abs(l),abs(r)) < 0.0001;
  58.          inspl || !quiet ?
  59.          (
  60.            pcm_buffer[0]=l;
  61.            pcm_buffer[1]=r;
  62.            inspl=1;
  63.            pos+=2;
  64.            pcm_buffer+=2;
  65.          );
  66.  
  67.          inspl && quiet ? 
  68.          (
  69.            (numsilent += 1) >= 2048 ? (
  70.              // new sample time
  71.              pcm_buffer-=numsilent*2;
  72.              sampleinfotab[num_samples*2+1]=(pos-numsilent*2);
  73.              num_samples+=1;
  74.              sampleinfotab[num_samples*2]=pcm_buffer;
  75.              inspl=0;
  76.              pos=0;
  77.            );
  78.          ) : numsilent=0;
  79.        );
  80.        sampleinfotab[num_samples*2+1]=pos-numsilent*2;
  81.        num_samples+=1; 
  82.     );
  83.     file_close(filehandle);
  84.   );
  85.   actsize=0;
  86. );
  87.   slider8=num_samples;
  88. sliderchange(slider8);
  89.  
  90. @block
  91. gpitchsc=2*slider3*spl_srate;
  92.  
  93. spl_nch == 2 ? (
  94.  
  95. while(
  96.   midirecv(pos,msg1,msg23) ? (
  97.     midisend(pos,msg1,msg23); // pass through MIDI
  98.  
  99.  
  100.   ws=((msg23&127)-midibase)|0;
  101.  
  102.   ((midichan > 0 && msg1 == 9*16 + midichan-1) ||  // if MIDI noteon
  103.   (midichan==0 && msg1>=9*16 && msg1 < 10*16)) &&
  104.       ws >= 0 && ws < num_samples ? (
  105.     voxsize>=voxmaxsize ? (
  106.        voxsize=voxmaxsize-1;
  107.        memcpy(voxlist,voxlist+voxentsize,voxentsize*voxsize);
  108.     );
  109.     p=voxlist+voxentsize*voxsize;
  110.     p[1] = sampleinfotab[ws*2];
  111.     p[0] = p[1] -pos / gpitchsc;
  112.     p[2] = p[1]+sampleinfotab[ws*2+1];
  113.  
  114.     vel = ((msg23 / 256.0)|0)/127.0;
  115.     p[3] = 1.0*vel + (zerogain*(1.0-vel));
  116.     voxsize+=1;
  117.  
  118.   ); //was noteon
  119.  
  120.   1;
  121.   )  // midi recv
  122.   : 0
  123. ); // while
  124.  
  125. );
  126.  
  127. @sample
  128.  
  129. spl_nch == 2 ? (
  130.  
  131. s0=s1=0;
  132.  
  133.  
  134. a=voxlist;
  135. loop(voxsize,
  136.   cpos = a[0];
  137.   cpos >= a[1] ? (
  138.      // samples, yeah!
  139.     gain=a[3];
  140.     addr=cpos|0; 
  141.     addr-=addr&1;
  142.  
  143.     s0+=addr[0]*gain;    // todo: interpolation
  144.     s1+=addr[1]*gain;   
  145.   
  146.   );
  147.  
  148.   cpos += gpitchsc;
  149.   cpos >= a[2]-1 ? (
  150.     voxsize-=1;
  151.     memcpy(a,a+voxentsize,voxsize*voxentsize - a); 
  152.   ) : (
  153.     a[0]=cpos;
  154.     a+=voxentsize;
  155.   );
  156. );
  157.  
  158. spl0+=s0*vol;
  159. spl1+=s1*vol;
  160. ); // spl_nch == 2
  161.