Recreating chord organ/qubit chord

I know that @NeilParfitt has worked on reproducing the Verbos Harmonic Oscillator, but I am wondering if anybody has created a 4 voice oscillator for playing chords? I have been using the Music Thing Chord Organ firmware and have also been interested in a Qubit Chord. I tried to reproduce this using Monome Ansible to trigger 4 sine voices, each with their own envelope and pitch, but I find that the sound isn’t always pleasant, even after reducing the volumes of each individual note. Perhaps there is something I’m missing here… including the role of the sync function for each oscillator? I tried it with Sine waves and found that Saw waves sounded a little better, but overall neither sounded as good as either the chord organ or qubit chord. Also, I should mention that they all had the same starting frequency.

I am not attempting to have the ER-301 play the chord voicings at this point, just getting a midi controller into Ansible to play 4 different cv’s into the ER-301.

2 Likes

I like to use sample players and the AKWF for this kind of thing… endless possibilities!

Have you tried a Ladder Filter in your chain post mix?

Also… slightly detuning each one by a couple of cents works wonders!

I’ve tried that too, but I’m trying to understand why it doesn’t sound good to use the internal oscillators to build this, whereas a qubit chord or music thing chord organ sounds ‘right’. Hard to explain, I guess.

What’s the patch?

This is the quick experiment I threw together. A1-D1 control pitch and gates 1-4 correspond to each oscillator. I didn’t save the Sine version, but it was the same idea.

sawpoly.lua.zip (2.1 KB)

1 Like

I’m following this

What’s your expanded description of “unpleasant”?

Is the tuning weird? Slightly out? Wide?

I’ve built poly patches using internal oscillators, sample players using a qmi for midi to cv and it sounds as it should.

Yeah, the tuning sounded wrong and note volumes seemed varied, especially using sines.

I think it might be due to clipping that you were having a hard time? Clipping (even soft clipping) adds harmonics that are probably not in the chord. Sine waves are especially vulnerable to this.

I cleaned up your patch (only very slightly), made sure there was no saturation anywhere, and then tried driving it with some 4-part counterpoint from the ER-101:

/original/1X/c67a603e2df26925b86b0b2e4029c91ee71f698c.mp3

Starts with 4 sine oscillators:

Chain Preset: sinpoly.lua (43.4 KB)

Then changes to 4 saw oscillators:

Chain Preset: sawpoly.lua (38.3 KB)

At the end, I just add just some stereo delay (via Variable Delay) for the fun of it.

14 Likes

Two more things which will likely be obvious to many but is always worth mentioning.

When you are dealing with pure sine waves they will always sound frustratingly quiet so there will be a strong tendency to try to crank up the volume on sine waves (especially low frequency sine waves). This almost guarantees clipping once you try to add 2 sine waves together.

Case in point: The audio clip in the previous post looks like this…

The SINE section looks louder (and is very close to clipping) but as you heard is actually much quieter than the SAW section.

The second pitfall with sine waves, is that pitch perception for humans falls drastically as you go below 100Hz.

Other waveshapes with added harmonics will mitigate this quite a bit via implied pitch:

Which is why chords made of pure sine waves will sound muddy and indistinct in the lower registers.

8 Likes

Thanks for taking a look. I think it must have been clipping on some of the notes and creating inharmonic tones, as your examples sound fine. I’m not quite sure how to tell if there is clipping, as the small window seemed ok - the waveform didn’t seem to be going above the bottom/top lines. Is there a way for me to monitor this better?

So far, my favorite chordal sound has been the saw wave with a high pass filter + delay. :smile:

1 Like

brian,
your song was awesome.
-jon

1 Like

Reviving this two year old thread because I’m wanting to do something similar to what is stated in the subject line.

I’d like to create a custom unit (or rather, control? or would it be better to do this in lua and then it’s a bespoke unit? Part of why I’m writing here is in hopes of getting some guidance about the most appropriate path…) that will allow for CV-modulatable selection of chords and voicings shown in the two lists below. The chords are shown as voltage offsets for root, third, fifth, and seventh. The voicings are shown as scale factors for root, third, fifth, and seventh. (Yes, I grabbed the basic musical info from the Qubit Chord manual).

I can think of multiple ways to achieve this, but I’m not sure of the “best” approach. I like Lua, and I’m not afraid to use it, if that will get me a cleaner result. But if that’s the recommendation, I’ll have more questions (like, is there any 0.4 era guidance for the middle layer?)

Here’s those lists:

Chords

Major 7

0.000, 0.333, 0.583, 0.917

Minor 7

0.000, 0.250, 0.583, 0.833

Dominant 7

0.000, 0.333, 0.583, 0.833

Half Diminished

0.000, 0.250, 0.500, 0.833

Diminished

0.000, 0.250, 0.500, 0.750

Sus 2 Major 7

0.000, 0.167, 0.583, 0.917

Sus 4 Minor 7

0.000, 0.417, 0.583, 0.833

Augmented 7

0.000, 0.333, 0.667, 0.833

Voicings

Closed

1.0, 1.0, 1.0, 1.0

Drop 2 Root Position

1.0, 0.5, 1.0, 1.0

Drop 3 Root Position

1.0, 1.0, 0.5, 1.0

First Inversion

2.0, 1.0, 1.0, 1.0

Drop 3 First Inversion

2.0, 1.0, 0.5, 1.0

Drop 4 First Inversion

2.0, 1.0, 1.0, 0.5

Drop 4 Second Inversion

2.0, 2.0, 1.0, 0.5

Second Inversion

2.0, 2.0, 1.0, 1.0

Raise 2 Root Position

1.0, 2.0, 1.0, 1.0

Raise 2/3 Root Position

1.0, 2.0, 2.0, 1.0

Raise 2/3 First Inversion

2.0, 1.0, 2.0, 1.0

Third Inversion

2.0, 2.0, 2.0, 1.0

Spread

0.5, 1.0, 1.0, 2.0

Spread First Inversion

4.0, 0.5, 1.0, 1.0

Spread Second Inversion

2.0, 4.0, 0.5, 1.0

Spread Third Inversion

2.0, 2.0, 4.0, 0.5

Big Spread Energy

0.5, 1.0, 2.0, 4.0

EDIT: Ok, I’m gathering from Middle Layer SDK (aka patching with Lua) that the mentioned files were updated around the 0.4.25 timeframe, which seems fresh enough. So, now I’m looking at ScaleQuantizerUnit.lua and it seems like a good starting point to work from… Somebody stop me if there’s a better way! :wink:

I guess the thing that is stumping me now has to do with appropriate signal flow for polyphonic music. It’s simple enough to put an oscillator in a mixer, put several of these side by side, and set the pitch for each, but keeping those pitches coordinated for western harmony… how do I avoid a spaghetti mess when trying to achieve that?

Makes me wonder if my bespoke unit should include the oscillator itself, not just the pitch information, but I was hoping for a more modular approach. Any advice?

Paging @Joe and @odevices (but no hurry of course! happy holidays!)

3 Likes

This can be done using a couple intances of Joe’s voltage bank unit, although it might be a bit tedious to enter all the different voltages.

I would suppose it can be patched in the middle layer but I’m not 100% sure how one would do it exactly. Seems like an interesting project though, I may look into it as well!

Btw if you’re interested in just playing polyphony, you may find these polyphonic synths pretty useful :slight_smile:

Here’s an idea: the problem is you can’t get 4 separate outputs from a single unit, so instead you could make a single small unit that can be configured to output the v/oct offset for a specific note in a given chord.

For example, if I wanted to play a major chord I would create three instances of the unit; one for the v/oct in each voice of a polyphonic synth. Then tune each to either the 1st, 3rd, or 5th and patch a separate cv control to determine which chord it is and the root note.

1 Like

I’ve thought about doing nearly exactly this in a bespoke unit but it never got past the idea phase. @tomf is right, one output per unit is going to be a challenge with making it more modular. A good first experiment might be modifying/extending one of his poly units.

I think multiple outputs might eventually be possible, at least in the middle layer. I’ve tried to get it to generate a signal inside a subchain that you could then tap as a local, but I never quite got it work. I think (hope) this is still on Brian’s eventual “look at” list. Here’s the discussion:

The Scale Quantizer might be a good way to go. I would prob be the most efficient way to store these values - as a scala file. I (think?) it could probably handle the chords by providing 4 different scala files, one to each scale quantizer unit - not sure how you’d handle the voicings/inversions with that kind of schema, though.

Another option is the sample scanner units. You could store the values in WAV files - all the notes of each chord linearly, then repeat them for each voicing - and then have the chord and voicing controls offset the index of the sample scanner, with the voicing control being a bigger offset than chord. That’s basically the idea I was playing around with.

A bit off topic but this strikes me as a great application for crow. One input for chord, the other for voicing. V/Oct offset could go directly direct to the oscillators. 4 physical outs or you could go i2c to the ER-301.

4 Likes

Exactly what I’ve been thinking about, crow running a qubit chord harmonising like script. Then you could turn JF or the 301 into a lovely chord machine. Sequencing it from ansible Kria would be fantastic!

3 Likes