GeonKick single - engine request?

Hello to all Zynthianists.

As I’ve been playing around with drum programs, I came across this note on GeonKick:

LV2 Plugin

There are two versions of the plugin: the default version and the “Single” version.

  • The default plugin version supports kits with 16 instruments and creates 16 stereo audio output channels per plugin instance. One instance of this plugin will use approximately 35MB of heap memory.
  • The “Single” plugin version does not support kits and only includes one instrument and one stereo audio output channel. One instance of this version will use about 2MB of heap memory. If only one instrument per track is needed, it is recommended to use the “Single” version of the plugin.

This applies to version 3.4.0.

Due to the fact that the classic GeonKick has 16 stereo outputs, which is simply not what Zynthian supports. So the new GeonKlick single allows you to play one sound on one stereo channel. Which is a way to avoid alternating left and right channels during round-robin.

After trying the installation in Windows and Linux, I thought that I would also try it in Zynthian and that in new image oram.

I’ve been following the recommendations on how to install Geonkick from their repository. I just excluded libjack-dev from apt-get. So it was as follows:

apt-get install build-essential cmake libsndfile-dev rapidjson-dev lv2-dev libcairo2-dev
git clone https://gitlab.com/Geonkick-Synthesizer/geonkick
mkdir geonkick/build
cd geonkick/build
cmake ../
make
make install

Surprisingly, everything worked.

I created a snapshot with seven instances of GeonKick, made a specific preset in each and saved it. In the mixer, I played with the settings of individual channels (volume and pan). And it works.

By the way, the assignment of the same midi channel for all instances of GeonKick is nice.

The only thing that doesn’t work is the display of available presets directly in the Zynthian UI, although I searched for them in webconf and even rebooted zynthian.

Here are the pictures and audio sample.

EDIT: and snapshot
013-geonkick-single.zss (9.9 KB)

4 Likes

That’s interesting. Well done! We do try to leverage multiple instruments in a single instance, e.g. Fluidsynth where several chains can each use different channels of the same, single instance. I wonder whether this would be a better approach than having so many different instances. Seeing all those native GUIs made me shiver with anxiety over resources.

Of course, I would take only one instance of GeonKick and load the entire Sound Kit in it. But what irritates me more is the resulting sound, which comes either only from the right or from the left. So I’d rather bother with multiple instances in the native GUI.

It looks like the muli-instrument version has a routing matrix with each drum routed to consecutive channels by default. Zynthian round-robin routes multiple outputs to stereo destination (like a zynmixer strip). We may be able to handle this better. It may be possible to limit the quantity of outputs or adjust the routing and panning. I haven’t tried and am not at my desk today.

GeonKick is quite interesting also for me. Some time ago I also did some experiments, but unfortunately it does not provide any lv2 parameters to be exposed for zynthian-ui.
Which is kind of understandable, because GeonKick’s UI is best been used with mouse and changes inside the wave form window (but not exclusively), has 3 layers and the mapping screen…
If someone could write code for exposing the parameters, or at least some, for lv2/vst3 ?? I think, it would be too much coding effort.
IMO geonkick is not directly usable in live situations without having the geonkick window itself.

BUT: Nice thing about geonkick is the ability to completely soft synthesize the drum sound from scratch (see the multiple youtube videos of unfa). And there is no other lv2 plugin which can do this - well, puredata… but then only 1 instance.

You could at least export the built sample or build a sample pack to be used in other sample players - I read about exporting to hydrogen, but never get it directly to work…

@riban resource of a single lv2 instance is about 2 MB each.

For Zynthian-UI processing, GeonKick single seems much better to me. Because those parameters will be 16 times less. Even so, it will be a lot of parties. Such a DrumSynth has 654 pages of Zynthian UI because it has a total of 24 notes for which all parameters can be set.

If I knew how to create ZynthianUI for LV2 plugins, I’d do it… But unfortunately I can’t, I’m just a learner :slight_smile:

LV2 plugins expose lv2 parameters, and zynthian just snaps them and shows them on the UI. So no programming necessary. But, geonkick is unfortunately not exposing these parameters to the world :frowning:
and there is also no API to remotely control geonkick …

It’s clear to me that it will require a lot of work on your part, that’s why I showed a temporary solution for GeonKick.

I thought that there was at least one interface with a file that should be named and displayed.

If this is really the case, then it limits us in use.

Well, I’m also no lv2 programmer, but would like to be…
I found something in the source code which probably helps in reducing the audio channel count for the single drum instance.

In src/dsp/src/geonkick.h there is a parameter called GEONKICK_MAX_CHANNELS which is defined as 1 if GEONKICK_SINGLE is defined - which should be…
but it seems as if GEONKICK_SINGLE is not defined during compilation. Because the kits widget shouldn’t be there (see lines 34-36 in src/control_area.h ).
hmmm… perhaps there is an issue with the cmake files.

Hi, I am the developer of Geonkick. Thanks for considering to include the Geonkick in Zynthian.

I’d like to understand what Geonkick should provide in order it to make easier the integration.
Plugin parameters or throughout MIDI? Running as a separate process with hidden GUI? Or you have a host for the plugin. Exposing controls through MIDI probably would be easier to be implemented and more dynamic. I am not a specialist on LV2, but the number of parameters are configured in the LV2 manifest fie, while Geonkick creates/removes additional controls and instruments…

5 Likes

Although this reply was to me, I recommend that @ToFF considers these questions. I know @ToFF is not a core Zynthian developer but he is more familiar with Geonkick than many of us, having invested so much time investigating drum modules within Zynthian. I don’t have the time to devote to such invetigation right now but will of course provide assistance as much as I can.

Hi @iurienistor,

I welcome you to the forum and thank you for your interest in supporting the Zynthian project easier integration GeonKIcku into it’s environment. I’m just a user trying to give feedback to those developing the whole system. Fortunately, there are more of us such users. @jofemodo is the boss here. @riban is the driving force behind programming and coming up with new Zynthian features. Now he and others are busy preparing the new Bookworm Oram 64bits image, which moves Zynthian from 32bits to 64bits. I also have to thank him for entrusting me with moderation in this area, even though I’m a complete layman in this, who can only twirl the knobs.

Focusing on the integration of GeonKick into the Zynthian environment, I realized that it is important to know:

  • Jalv host is used for hosting LV2 plugins
  • Zynthian supports LV2 Control Ports

I found it in the thread Hosting LV2s which will tell you more than me.

I will describe my idea of integrating GeonKick into the Zynthian environment from the user’s point of view, and hopefully the right people will respond to technical questions.

Based on what exists in Zynthian, there is a LV2 DrumSynth plugin, which is close to your GeonKick in terms of control philosophy. It even has graphs for setting the course of parameters over time, but I would say that it is statically limited to 4 setting points. DrumSynth for 24 sounds displays a total of 654 pages of settings. I have described it here from the user’s point of view.

An example of the last page is in the picture.

Zynthian has a wonderful feature that each of the parameters that appear in its UI can be mapped by a simple mechanism (for the user) to a specific CC. This is detailed in the wiki Zynthian UI User Guide - V1/V4 - ZynthianWiki

If I convert the image to pseudo code, I would describe this page as:

Name_page: Ctrl#654
Ctrl_1: Dist on
Ctrl_2: Clipping
Ctrl_1: Bits
Ctrl_2: Rate

In the case of GeonKick, for example, for Level 1 L1 Oscillator 1, I would have accessible settings on 3 pages of the Zynthian UI:

Name_page: L1 Osc 1 #1
Ctrl_1: Oscillator 1 (values: ON/OFF)
Ctrl_2: Wave Function (values: Sine/Triangle/Sample/Square/Sawtooth)
Ctrl_1: Phase
Ctrl_2: Amplitude

Name_page: L1 Osc 1 #2
Ctrl_1: Frequency
Ctrl_2: Filter (values: ON/OFF)
Ctrl_1: Filter Frequency
Ctrl_2: Q

Name_page: L1 Osc 1 #3
Ctrl_1: Filter type (values: LP/BP/HP)
Ctrl_2:
Ctrl_1:
Ctrl_2:

I would resign from the possibility to set Amplitude and other parameters depending on time, which are done by clicking on the graph. Here, the number of points is generated dynamically, apparently.

From the user’s point of view, usually, working with the filter frequency is more important when playing live.

But here I also see a weaker element of my proposal. The standard range of 0-127 for CC messages is very rough, especially when setting the oscillator frequency, when I imagine it should work across the range. Here, it would probably be good to be able to set some lower and upper limits. But I’m going into too much detail.

And a question-comment from the peanut gallery for all involved @iurienistor , @ToFF , @riban , @gitnob . I believe you have the options of including Geonkick as either a ‘Zyngine’ (also sometimes referred to as a synth, an engine, a program) OR an LV2 plugin using jalv as the plugin host. Or both options can be allowed. That is my somewhat dim understanding of the major choices for incorporating an existing program into Zynthian.

I’d be interested in hearing if that is basically correct, flat out wrong, or some hideous combination of the two!

Welcome @iurienistor , I just wanted to contact you anyway, but couldn’t find a contact info. So - nice to meet you directly on zynthian discourse.

I just cloned/forked geonkick and try to understand some of your code (I’m not an expert unfortunately :frowning: ).
My first goal was to reduce the output channels to a single stereo channel, but still having 16 instruments to play with.
Second goal is to get rid of the extra audition channel, although I understand the idea of having an extra audition channel for the samples.
IMO, all this can be done by using the standard behaviour of the lv2 plugin, changing a little bit of the dsp code and rewriting the ttl file, just with the first two output channels, which are mapped to the lv2 plugin.

To your question: “I am not a specialist on LV2, but the number of parameters are configured in the LV2 manifest fie, while Geonkick creates/removes additional controls and instruments…”

What do you mean by “creates/removes additional controls and instruments …”. Are there already controls which could be used in the ttl file already?

On the other hand, as @ToFF said, it is probably not wise to implement all lv2 controls into the zynthian-plugin’s ttl file to not getting lost in a parameter jungle grouped by 4… Probably some kind of reduced list to be able to perform in live situations.

Beside others the real strength of geonkick is that you can define custom time dependent graphs for several parameters, which can not be done by simple knob changing in the lv2 menu screen. To be able to do this zynthian would need a special engine (like in the case of sooperlooper), with a custom screen in zynthian to change these curves.

@iurienistor: What options are the best to be implemented into geonkick’s code to get access (set and get(?)) to all of these parameters, or are there already some? Another possibility would be to use OSC (like with sooperlooper’s zynthian engine).
What is your plans/ideas of remote connections to the geonkick?

Zyngine is an abstraction from the process that runs the audio / MIDI processing. It presents controls in a consistent manner that Zynthian can then access. Jalv is used to host LV2 with a zyngine wrappers around it so that any LV2 can be hosted. There are also dedicated zyngine wrappers for binary processes such as aeolus, zynaddsubfx, Pianoteq, etc. There needs to be some interface to the process, e.g. CLI, MIDI, OSC, etc.

We also have some zyngine wrappers for shared libraries. This is mostly modules we have written like zynaudioplayer. We could similarly wrap a shared (or static) library of there was good reason and available effort.

1 Like

Ahh, thanks for the explanation!

Hi, thanks for your answer. Since I’ve seen that Zynthian uses jalv for hosting LV2, I think the best option is to implement/expose LV2 automation parameters for Geonkick controls. I don’t think it will be possible to expose the envelope points; they are created/deleted dynamically… probably only for some of the oscillator and filter controls.

For the output channels, there is something in the code that can be set: GEONKICK_MAX_INSTRUMENTS to 16 or other values and GEONKICK_MAX_CHANNELS to 1. Then, the audition channel should be GEONKICK_AUDITION_CHANNEL_INDEX = 0…

Theoretically, it should work, but I have tested and it is not working. So, there is a need for something to be fixed in order for these settings to work. Maybe also to add some CMake arguments to set these values too. I plan to work on this, but not for the next release.

:+1:

Regarding envelope points: yes, this would be difficult to implement via lv2. It would be easier to have just start value, end value and type of curve (linear, exponential, logarithmic) with only 3 parameters for allowing easy lv2 control. But then you’ll loose the advantages of geonkicks custom envelopes…

IMO lv2 parameters are more usable in live playing situations, and not in sound design phases. Hence automation for parameters like amplitude, length, cut-off, Q-factor, drive amount … would be helpful.
Also very helpful would be to load a preset (kit) via lv2.

But other zynthian users might have another opinion.

Perhaps we should in the first place collect a list of lv2 controls which should be available in geonkick?

This was also my observation, and this was, why I forged it on github.
ATM I’m trying to figure it out.

But first of all thanks.

That’s absolutely ok.

Great plugin/application for drum sound design - did I say this already :smiley:?

1 Like

If any Zynthianists are interested, I’ve added the Geonkick binaries compiled to the oram version to my github. Having already created it for the Surge XT, I regretted not adding it there.

2 Likes