User Forum    :: Powered by YaBB
  « MIDI-OX User Forum - Midiox script to map expression pedal to kick drum »
Welcome, Guest. Please Login or Register.
May 9th, 2025, 9:01am


Home Home Help Help Search Search Members Members Login Login Register Register


   MIDI-OX User Forum
   MIDI-OX
   Scripting Questions
(Moderator: Jamie OConnell)
   Midiox script to map expression pedal to kick drum
« Previous topic | Next topic »
Pages: 1  Reply Reply Notify of replies Notify of replies Send Topic Send Topic Print Print
   Author  Topic: Midiox script to map expression pedal to kick drum  (Read 4540 times)
PenguiN42
New Member
*



MIDI-OX Rules!

   


Posts: 2
Midiox script to map expression pedal to kick drum
« on: Jan 23rd, 2011, 4:53am »
Quote Quote Modify Modify

So I've found a few utilities out there that map the sustain pedal to a kick drum hit, but the problem with that is you don't have any velocity control.  
 
So I thought -- wouldn't it be cool to use a volume or expression pedal and deduce the velocity from that, and make a MIDI kick drum out of it?
 
Below is a VBscript for midi-ox that does just this. Feel free to use and abuse it! I tested it with a Roland EV-5 through an m-audio Axiom 61 into Cakewalk's Session Drummer 3 and it felt pretty good (other than the lack of spring action in the pedal). Here's a test track I recorded with it http://soundcloud.com/ken-taylor/drum-gtr-test-012211
 
And here's the code:
 
(Edit: I should probably mention that the code in its current form is very dependent on the rate at which your midi device sends controller updates. I originally tried to make it independent by using timestamps, but that wasn't consistent enough in my tests, so I just put in a fudge factor instead that assumes the device is sending at a constant rate. You can see the commented out timestamp-lasttime and lasttime-lasttime2 in the code below)
 

' For use with MIDI-OX
' Translates expression pedal hits into bass drum hits with velocity info
 
option explicit
 
dim thresh, in_ctrl, out_note
 
dim v_in_min, v_in_max
dim v_out_min, v_out_max
 
dim nonlin
 
thresh = &H50
in_ctrl = 11
out_note = 36
v_in_min = 0
v_in_max = 3.5
v_out_min = 0
v_out_max = &H7F
nonlin = 0.7
 
dim lasttime, lastpos, lasttime2, lastpos2
dim mox
 
lasttime = 0
lastpos = 0
lasttime2 = 0
lastpos2 = 0
 
' Create object  
Set mox = WScript.CreateObject("MIDIOX.MOXScript.1", "OnTrigger_")  
 
mox.DivertMidiInput = 1 ' when set, routes all data  
mox.FireMidiInput = 1 ' begins input  
 
Do While mox.ShouldExitScript = 0  
   WScript.sleep(1)
Loop  
 
 
mox.FireMidiInput = 0 ' stops MIDI input  
mox.DivertMidiInput = 0  
 
' -----------------------------------------------------------  
' This is the function that gets called by MIDI-OX  
Sub OnTrigger_MidiInput( timestamp, port, status, dat1, dat2)  
   dim vel_in1, vel_in2, vel_in, vel_out
    
   if status = &HB0 and dat1 = in_ctrl then
     if (lastpos < thresh) and (dat2 >= thresh) then
       vel_in1 = (dat2-lastpos)/20 '(timestamp-lasttime)
       vel_in2 = (lastpos-lastpos2)/20 '/(lasttime-lasttime2)
       if (vel_in1 > vel_in2) then
         vel_in = vel_in1
       else  
         vel_in = vel_in2
       end if
       'vel_in = (vel_in1+vel_in2)/2
        
       vel_in = ((vel_in-v_in_min)^nonlin)/((v_in_max-v_in_min)^nonlin) _
                 *(v_in_max-v_in_min) + v_in_min
        
       'MsgBox("threshold crossed, vel = " & vel_in)
       vel_out = ((vel_in-v_in_min)/(v_in_max-v_in_min))*(v_out_max-v_out_min)+v_out_min
       'MsgBox("out vel = " & Int(vel_out))
       'MsgBox("status = " & status)
        
       if(vel_out > v_out_max) then
         vel_out = v_out_max
       end if
        
       if(vel_out < v_out_min) then
         vel_out = v_out_min
       end if
        
       mox.OutputMidiMsg -1, &H90, out_note, Int(vel_out)
       mox.OutputMidiMsg -1, &H90, out_note, 0
     end if
      
     lastpos2 = lastpos
     lasttime2 = lasttime
     lastpos = dat2
     lasttime = timestamp
   else
 
      ' ship it right back  
      mox.OutputMidiMsg -1, status, dat1, dat2  
   end if
End Sub  
 
« Last Edit: Jan 23rd, 2011, 5:28am by PenguiN42 » IP Logged
Pages: 1  Reply Reply Notify of replies Notify of replies Send Topic Send Topic Print Print

« Previous topic | Next topic »


MIDI-OX User Forum » Powered by YaBB 1 Gold - SP 1.3.1!
YaBB © 2000-2003. All Rights Reserved.