Drum trigger without a drum trigger

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
5 Likes

Good job @Frank1119 ! :slight_smile:

2 Likes

I think meanwhile - with the newer Logic Pro versions you could use the integrated Logic Out MIDI Port and even get rid of the IAC :wink:

1 Like

It’s really interesting that you came up with this lighting use case because during the first private discussions we had with @Frank1119 about what an Envelope Follower should be and how it should translate in terms of signal processing, my first algorithm proposal came from an idea I had after seeing an Envelope Follower intended for lighting control. Now that you’ve come to this lighting application, I think we’ve completed the circle! Well, not sure, GP users have so many new ideas…
I agree with @npudar, great job from @Frank1119! :wink:

3 Likes

:blush:
Glad to be of help

3 Likes

Apart from triggering the lights I use the method for something else, too:

The use of the paid trigger plugin (GP4) oder the envelope follower (GP5) allows me to realize the side chaining effects of modern songs on stage. In the studio, the bass drum is fed to the side chain input of a compressor on the sum, the sum except for bass drum or a bus with noise.

I tried a couple of things:

  • The easiest way would be to feed the sound card input with the bass drum to the side chain input of the compressor
  • If you want global processing of the trigger signal before entering the side chain, you should feed that to the „to rackspace“ block of the global rackspace
  • The bass drum signal proved to be too „human“ live so I rather use the drummer’s metronome signal
  • To get closer to the studio approach, I feed the metronome audio to the envelope generator and its MIDI output to DecentSampler playing a 808 bass drum to a „to rackspace“ bus.

This gives me the best results to authentically replicate studio stuff live.

1 Like