We have a round 4-color LED panel in front of the bass drum connected to a MIDI-to-DMX converter. The colors are controlled by a Logic project fed through Gig Performer so everything stays in sync with the music. The cool thing is that the drum cannot only light up permanently but also uses a trigger signal for flashing on the beats.
After a few tries I came up with the easiest and cheapest cabling solution: no trigger at all but use Gig Performer for that task! Since AVB is the protocol our entire stage is connected with, it’s easy to feed the base drum mic signal back into Gig Performer. (It would also work with just an analog connection, of course.)
I bought a plugin called DSP trigger that creates midi signals from the audio. A scriptlet outputs the corresponding MIDI information to the LEDs.
I cannot believe that the roundtrip „Bass Drum Audio → Gig Performer → MIDI to LEDs“ happens with almost no visual delay and the flash feels like being exactly on the kick.
Update for GP5: While I’m still gigging with version 4, one thing came to my mind when I read this thread: I tried to swap the paid plugin with the integrated envelope follower of GP5 and the results are amazing! The peak detector is on average 30 ms faster than the paid plugin. This makes the flash even tighter!
Looking at the screenshot you see that the audio is coming into the envelope follower sending its MIDI to a scriptlet that defines the length of the flash:
On ControlChangeEvent(m : ControlChangeMessage) Matching 2 // Peak Signal from Envelope Follower
SendNow(MakeControlChangeMessage(0,127)) // Send Trigger on signal
SendLater(MakeControlChangeMessage(0,0),200) // Send Trigger off signal after flash duration of 200 ms
End
The desired colors come from Logic via the IAC bus. CC1-CC4 are the colors red, green, blue, and white for the regular state. CC5-CC8 are the RGBW colors of the flash when the drum is kicked.
The second scriptlet stores these values and sends them out according to the trigger state.
var
LEDin_Array : Integer [9]
Trigger : Subrange Parameter 0..1 = 0
On ControlChangeEvent(m : ControlChangeMessage) Matching 0
If GetCCValue(m) == 127 then
Trigger = 1
Else
Trigger = 0
End
End
On ControlChangeEvent(m : ControlChangeMessage) Matching [1..4] // Brightness input (RGBW) for regular state
If Trigger == 0 then
SendNow(m) // If not kicked send out RGBW directly
End
LEDin_Array[GetCCNumber(m)] = GetCCValue(m) // Store brightnesses for later
End
On ControlChangeEvent(m : ControlChangeMessage) Matching [5..8] // Brightness input (RGBW) for kicked state
LEDin_Array[GetCCNumber(m)] = GetCCValue(m) // Store brightnesses for later
End
On ParameterValueChanged matching Trigger
If Trigger == 1 then // If bass drum is kicked send out saved RGBW for kicked state
SendNow(MakeControlChangeMessage(1, LEDin_Array[5]))
SendNow(MakeControlChangeMessage(2, LEDin_Array[6]))
SendNow(MakeControlChangeMessage(3, LEDin_Array[7]))
SendNow(MakeControlChangeMessage(4, LEDin_Array[8]))
Else // If kicked state is over send out saved RGBW for regular state
SendNow(MakeControlChangeMessage(1, LEDin_Array[1]))
SendNow(MakeControlChangeMessage(2, LEDin_Array[2]))
SendNow(MakeControlChangeMessage(3, LEDin_Array[3]))
SendNow(MakeControlChangeMessage(4, LEDin_Array[4]))
End
End