"Simple" DJ multi effects unit?

Hello

I’m not sure if I’m at the right place, but after weeks of search someone here might have an answer.

TL;DR: I’m looking for a “thing” with stereo in / out, preferably BPM detection and multiple effects like echo/delay, Reverb, flanger, filter, etc. and simple interface. And 100% wet signal.

There are commercial solutions, like Eventide H9, but oh my the configuration app is horrible. It’s just not fun to work with. 500 EUR

Union Audio LE FX comes very close, but after duty / tax / import it’s north of 590 EUR and limited when it comes to send/return effects, build for master insert.

And I enjoy open source project. I can do linux, programming and hold a soldering iron, even 3d print a case, but never touched anything effects / vst / audio processing.

Is zynthian a good starting point? With a bit of programming is it possible to add BPM detection? Maybe a simple interface where I have a rotary encoder to run through a short list of effects?

I did a very quick look into MOD audio desktop, but only found about 2 effects that where usable for my needs.

Thank you for your time.

Hi @lord-carlos !

Perhaps you would like the Perfomix plugin, contributed by @gitnob some time ago. You will find it in the “modulation” category.

Briefly, it could be described as:

Build-up audio effects with looper function. The idea behind this plugin is driven by EZBot’s Performance mixer for the Octatrack, where the device is used as a complex effect’s chain for transitions during live performances.

There is a nice teaser video:

And you can read the original post:

And read the full documentation in the wiki:

Enjoy!

2 Likes

and, you can ask me if you have any suggestions, ideas, wishes,questions, demands, … what else.. about the plugin.

For beat detection there is always the possibility to use a puredata patch. If it’s midi beat synching, Zynthian already has this build-in.

Regards

2 Likes

Cool cool. Thanks both of you.

I will order a pi 5, connect it to my interface (Xone 96) and start messing about. If it does not work out in a way I find useful, I can always re-use my Pi for other projects :slight_smile:

I just looked into PureData and oh my, it will be an uphill battle :smiley:

Will you please describe what you want to do with, “BPM detection”? It may help to understand what you want to do. As mentioned by @gitnob there are different workflows and meanings for this

Sure thing.

For time based effects like delay / echo / loops I want to set the BPM just right. I dislike to TAP the bpm, or i might forget.

If I play some 4/4 electro it should be possible to detect the BPM automatically based on the incoming signal. When I play vinyl there is no midi signal with bpm data.

The end goal is to have a device similar to this:

Just .. different and DIY :slight_smile:

Now if I use it as a send/return effects unit it will only get an audio signal when I actually want to hear the effect. So maybe I would also need to “lock” it and only auto adjust when I want. But that is a bridge to cross for when I get there.

AI seem confident it can create a Pd file that can do it. But then again AI is always confident.

AI Dp file to detect bpm on 4/4 electronic music

#N canvas 120 80 900 600 12;
#X text 20 20 4/4 BPM from live audio (kick-focused\, 4-beat lock\, Vanilla Pd);
#X obj 30 70 adc~ 1;
#X obj 30 100 lop~ 150;
#X obj 30 130 hip~ 20;
#X obj 30 160 env~ 256;
#X floatatom 30 190 5 0 0 0 Env_dB - -;
#X obj 30 220 t f f;
#X obj 30 250 > 58;
#X floatatom 150 250 5 40 100 0 Threshold_High_dB - -;
#X obj 30 280 change;
#X obj 30 310 sel 1;
#X obj 150 280 < 52;
#X floatatom 230 280 5 30 90 0 Threshold_Low_dB - -;
#X obj 150 310 change;
#X obj 150 340 sel 1;
#X obj 90 370 f 0;
#X obj 90 400 pack 0 0;
#X obj 90 430 route 1 0;
#X text 320 220 Hysteresis: rise above High to arm\, fall below Low to re-arm;
#X obj 30 460 spigot 0;
#X obj 90 460 == 1;
#X obj 30 490 t b b;
#X obj 30 520 s beat;
#X obj 120 520 realtime;
#X floatatom 120 550 7 0 0 0 IOI_ms - -;
#X obj 120 580 moses 150;
#X obj 190 610 moses 2000;
#X obj 270 640 t f;
#X obj 270 670 expr 60000/$f1;
#X floatatom 270 700 7 0 0 0 BPM_1beat - -;
#X text 420 70 Kick emphasis: [lop~ 150] then [env~ 256];
#X obj 420 100 loadbang;
#X msg 420 130 58;
#X msg 460 130 52;
#X msg 500 130 120;
#X obj 500 160 s refractory;
#X obj 380 520 r refractory;
#X floatatom 380 550 5 60 250 0 Refractory_ms - -;
#X obj 380 580 delay 150;
#X obj 380 610 0;
#X obj 330 610 1;
#X obj 330 640 s gate;
#X obj 380 640 s gate;
#X obj 30 430 r gate;
#X text 420 160 Use Refractory to block doubles after a trigger;
#X text 420 190 Typical: High 56–62 dB\, Low 48–54 dB\, Refractory 100–160 ms;
#X obj 570 220 r beat;
#X obj 570 250 counter 0;
#X obj 570 280 + 1;
#X obj 570 310 mod 4;
#X floatatom 570 340 5 0 0 0 BeatIndex(0-3) - -;
#X obj 650 250 sel 0;
#X obj 650 280 realtime;
#X floatatom 650 310 7 0 0 0 Window_ms(4beats) - -;
#X obj 650 340 expr (60000*4)/$f1;
#X floatatom 650 370 7 0 0 0 BPM_4beat - -;
#X obj 650 400 t f b;
#X obj 720 430 f;
#X obj 650 460 expr (0.65*$f1)+(0.35*$f2);
#X floatatom 650 490 7 0 0 0 BPM_smooth - -;
#X obj 650 520 int;
#X floatatom 650 550 7 0 0 0 BPM_rounded - -;
#X obj 650 580 s bpm;
#X text 420 220 4-beat averaging for stability (reset at beat index 0);
#X obj 500 100 bang;
#X text 20 40 Only vanilla objects: adc~\, lop~\, hip~\, env~\, >\, <\, change\, sel\, spigot\, delay\, realtime\, expr\, int;
#X obj 30 610 r bpm;
#X floatatom 30 640 7 0 0 0 BPM_out - -;

#X connect 1 0 2 0;
#X connect 2 0 3 0;
#X connect 3 0 4 0;
#X connect 4 0 5 0;
#X connect 5 0 6 0;
#X connect 6 0 7 0;
#X connect 7 0 9 0;
#X connect 8 0 7 1;
#X connect 9 0 10 0;
#X connect 6 1 11 0;
#X connect 11 0 13 0;
#X connect 12 0 11 1;
#X connect 13 0 14 0;
#X connect 14 0 15 0;
#X connect 10 0 15 0;
#X connect 15 0 16 0;
#X connect 16 0 17 0;
#X connect 17 0 19 1;
#X connect 19 0 21 0;
#X connect 20 0 19 0;
#X connect 21 0 22 0;
#X connect 21 1 36 0;
#X connect 22 0 24 0;
#X connect 24 1 25 0;
#X connect 25 0 26 0;
#X connect 26 1 27 0;
#X connect 27 0 28 0;
#X connect 28 0 29 0;
#X connect 31 0 61 0;
#X connect 61 0 32 0;
#X connect 61 0 33 0;
#X connect 61 0 34 0;
#X connect 35 0 37 0;
#X connect 36 0 37 0;
#X connect 36 0 39 0;
#X connect 37 0 38 0;
#X connect 38 0 41 0;
#X connect 40 0 41 0;
#X connect 41 0 19 0;
#X connect 45 0 46 0;
#X connect 46 0 47 0;
#X connect 47 0 48 0;
#X connect 48 0 49 0;
#X connect 49 0 53 0;
#X connect 50 0 51 0;
#X connect 51 0 52 0;
#X connect 52 0 54 0;
#X connect 53 0 55 0;
#X connect 55 0 56 0;
#X connect 56 0 57 0;
#X connect 57 0 58 0;
#X connect 61 0 8 0;
#X connect 61 0 12 0;

I already wrote a small python script that can BPM detect tracks, which I use to label my vinyl records.

1 Like

We could add an audio to BPM module but it would require a feature twist and preferably some developer effort. Maybe what you have already done may form a starter.

I just opened the AI generated file from the confident AI to see what it does. I stopped looking at it when I saw that messages are connected wrong. Well, as you said, they are always confident, until you say “no, this is not correct”, and you’ll get another more confident answer :wink:

It’ll be better to use “classic” internet search for beat detection with puredata. Or just beat detection.

Like that one in the else library of pd. With different detection algorithms and lookup window sizes, and …

I could just make a puredata patch and send some BPM data via OSC to Zynthian’s CUIA for example. This could synchronize an audio input to the BPM of Zynthian’s internal metronome. I don’t get information about the beat or bar starts, but it could be helpful in @lord-carlos case.

But… as any detection it’s not 100% correct.

The Union Audio LE page says “and a BPM delay with automatic BPM detection that will allow timing to be overridden by a tap tempo button”. Hence both, and IMO it’s necessary because automatic detection could be unprecise or wrong. In your case it would perhaps helpful to use a foot switch for your BPM TAP button, to have both hands free and setting the BPM by foot?

@riban: Wouldn’t it just be better to have a beat detection option within the metronome code?

Regards

I’ll give it a try this weekend…

Hence Zynthian could be used as a free programmable DJ-tool, with BPM detection for effects….

Regards ….

O no, it could be so easy, but I forgot that Zynthian is still on puredata version 0.53.1. The else library is not good enough for this. Would be nice to have the puredata version from the bookworm backport… 0.55.1 at least.

I’m going to try to install this backport version then without destroying my whole Zynthian system.

Question: Would it be an option to install the backport version for puredata in general on the distribution of Zynthian instead of the old bookworm version? Or does it make things too messy.

Regards

2 Likes

The trigger word is, “just”. Anything is possible, but nothing is easy! It would be good to have a beat detection module in zynthian as core functionality but someone has to write it. I haven’t had time to look. There may even be one written already, e.g. LV2 plugin???

Zynthian Will follow a MIDI clock or a slower GPI timing pulse, extrapolating to attempt a stray beat. If a software module can detect beats in audio, it could be merged into the zynthian tempo control.

1 Like

@riban, okay.

What do you mean by module? I could try to write a zynthian engine in python, because there is a python module called aubio for audio analysis, which is exactly the base of puredata’s else/beat~ abstraction. Then it would be a special engine.

Or directly in the timer GUI. I’m not sure where exactly in the python codes of zynthian to implement a “core functionality” for the BPM detection. Would it be the best in zynthian_gui_tempo.py ?

If you could give me a hint, I’d give it a try.

Regards

Github is our friend. We need something super efficient (c or c++) we can integrate at low level in the Jack loop.

1 Like

or as I said GitHub - aubio/aubio: a library for audio and music analysis

python library is just a wrapper around that. BTW, with low level C programming I’m out ;-(, sorry.

You could do something similar to aubionotes which is integrated as an audio to midi device, early in the zynthian data flow model. It would be similar in that it needs a selectable audio input (like we can do with aubionotes). A high-level solution may be to create a pulse per detected beat onset and feed that to the zynseq beat detector, like we do with GPI for our analogue clock detection. This isn’t perfect but it is already there so, feeding into that would be a consitent beat detection which could be improved in the future.

A quick review of the code shows that state_manager has a function set_transport_clock_source() that sets zynseq to use internal, MIDI or analogue clock. There doesn’t seem to be any specific code in zynseq lib for analogue so I think we just convert pulses to MIDI CLOCK events and feed them to zynseq. We could start with that, i.e. a software module that listens for audio beat onset and sends a MIDI CLOCK for each beat. This is far simpler than the tempo detection that various models offer and may be suboptimal but we could add those models later, once we have the onset beat detection working.

1 Like

this page Real Time Beat Prediction with Aubio › maxhaesslein.de describes a possible imlementation in Python, just as an idea.

If you ask me, how I would use Zynthian as an audio FX box for DJ-ing, the most easiest implementation would be to use a foot button as tap for setting more or less synchronized BPM and beat onset. This would be my preferred method. This is because the external audio sources are variant, and especially beat detection/beat onset synchronization is not reliable enough in more than some cases.

For delays, echos, etc. there is no automated synched beginning necessary. Looping in Perfomix is not synchronized to the beat, only the length is dependent from BPM.

Regards

1 Like

Sidetracked maybe, but;
I have one DMX light at home that i bought many years ago and occasionally used as an autonomous light.
Now i’m thinking that something could be put together with Aubiochaines with beat detection, real time midi notes (live midi) and sequenced midi. If all those signals could go through something (internal/external) and produce light and other DMX related stuff in sync with whatever was playing on the Zynthian i would surely buy some more DMX gear.
I have only rudimentary understanding of these things, but i think that Zynthian could output OSC to a program like Lightjam (running on another maschine) and Lightjam in turn could act as a controller for the incoming signals and output in DMX format. Or even better everything could be contained inside Zynthian, plugin or what.
Is this just wishful thinking or maybe realistic?

1 Like

No, I don’t think food switch is necessary. Here is what the fx interface looks like on a DJ mixer with build in effects:

Most just tap the TAP 4’ish times.

Most DJs have enough time to do this with the hand.

That is actually what I used for a Desktop app that overlays the BPM from live audio input.

But I’m bad at python and never did any audio programming. I somehow had to do a bpm_estimate = self.tempo.get_bpm()*0.993 otherwise the BPM was not correct :smiley: Though I’m sure a proper programmer can do better.

Thanks, I might have to look at that and update my code. I could even implement midi send to send the bpm to zynthian via my computer. As a stop gap solution. End goal is to have a thing that would work without computer.


My ~ideal~ setup:

  • FX select with rotary encoder
  • TAP button for manual BPM
  • Holding TAP button down starts Auto BPM, once you let loose the bpm is fixed. Maybe a setting for permanent Auto BPM? Unless you hammer TAP again.
  • a few rotary encoder for effects settings (1/2, 1/4, 1/16 echo etc.)

Raspberry pi is shipped🙏

Not at all. There is a dev branch where DMX control is integrated with zynthian. If I find time over Christmas I may try to integrate it into the current dev branch.

This is already implemented in zynthian. There is a tap for tempo in the tempo page. We could map a footswitch to this to allow it to be done with foot or hand.

3 Likes

It is the same incredible thing every Christmas time! Wishes come true.
I will look forward to try it out, maybe i should just fiddle a little with de dev branch and have a look, i would guess some hardware is needed to engage with the DMX gear!

1 Like