Composite (Layered) Voices

A Comprehensive How-To

Note: This article is a re-do of the earlier article on the topic I wrote in October of 2014. The information presented here is much better, and more comprehensive than the earlier article. Though the earlier article is somewhat useful, this article should be used as a more comprehensive reference on the topic.

Using only synthesizers with General-MIDI sounds (and a MIDI router), you can create amazing instrument sounds available only on expensive synthesizers, or with VST instruments using a number of chained instruments and/or effects.

I do this on Linux, using qsynth (a GUI front-end for the Fluidsynth software synthesizer), using the FluidR3_GM soundfont, along with the qmidiroute MIDI router, and the JACK audio connection kit (qjackctl).

I like these sounds so much, that I use them every time I perform, even though it requires a little more effort and time in setting things up.

So, what are composite voices, and why would you want to use them?

A composite voice is an instrument sound (voice) made up of more than one instrument sound. My favorite example of a composite voice, is piano sound in the foreground, with a string ensemble in the background.

The reason I like using it, is when you are playing high notes with just a piano sound, the sound gets thin and dies-away quickly. But with the composite voice (piano + strings), the sound is sustained – even on the very highest notes. It gives the illusion of a piano playing with string-orchestra backing.

In developing composite-voice sounds using the FluidR3_GM.sf2 sound-font, There are three sounds I like to use as background sounds (as identified in the “Instrument” drop-box of the performance pane):

I also like to use the “1-Bright Yamaha Grand” sound as the background voice for the chords (but at a similar volume-level to the “48-Strings” sound). This gives the chords instrument a more percussive quality, letting you do somewhat fast, repeated chords, with good affect.

In what I have set up, the “Volume” control also affects the background voice. More importantly, the balance of the loudness of the background voice relative to the foreground voice, is controlled by the “8-Balance” assignable slider, so you can change the balance between the foreground and background voices by clicking on the up and down arrows (⬆⬇) as you play.

Here is a table showing the foreground and background sounds I have set up for each function-key performance pane, as well as for the chords:

Performance-Pane

Foreground-Instrument

Background-Instrument

F2

1-Bright Yamaha Grand

48-Strings

F3

5-Legend EP 2

52-Ahh Choir

F4

25-Steel String Guitar

93-Metal Pad

F5

42-Cello

91-Space Voice

F6

68-Oboe

52-Ahh Choir

F7

52-Ahh Choir

48-Strings

F8

73-Flute

93-Metal Pad

F9

60-French Horns

52-Ahh Choir

F10

91-Space Voice

52-Ahh Choir

F12

70-Bassoon

93-Metal Pad

Chords

48-Strings

1-Bright Yamaha Grand

I have improvised a piece using these composite voices, starting with the F2 performance pane, up through the F12 performance pane.

Listen carefully to the first three instrument combinations (F2 through F4), since they give you a good feeling for the effect the background instrument adds to the instrument by itself.

Also in the F7 instrument combination (Ahh Choir with Strings), notice how the background sound carries-on when notes are used above the range of the human voice.

Click on the link below, and listen as it works through each performance pane (F2 through F10, and F12). Some of the performance panes use the Chords-Pane instruments. Try to hear the various foreground and background instruments detailed in the table above.

Composite Voice Examples MP3 File

These sounds are made by sending the performance data (MIDI signals) from my KeyMusician Keyboard, to two different synthesizers (a foreground synthesizer, and a background synthesizer) simultaneously, on the same MIDI channel.

The instruments in the background synthesizer are set at a lower volume level than those of the foreground synthesizer. This mix of volumes is controlled by the “8-Balance” assignable slider, and can be set differently for each performance pane.

Also, the use of the sustain-pedal, which works great on a piano sound (which fades away quickly), doesn't get passed on to the background instrument. Using the sustain-pedal on a melodic sound (such as a string-ensemble) smears the notes together in a non-pleasing way. Therefore, filtering-out the sustain-pedal signals is a must.

Here is how I accomplish this on Linux:

In this case, for sound synthesis I am using Qsynth, which is a GUI front-end for the Fluidsynth software synthesizer. It is configured to provide three separate synthesizers ('engines'), of which two (Qsynth1 and Qsynth2) are used in this example.

Both Qsynth1 and Qsynth2 use the FluidR3_GM sound-font, while Qsynth3 uses the MuseScore GM sound-font.

The Qsynth window is shown in the screen-shot below:


I use QjackCtl (the GUI front-end for the JACK Audio Connection Kit, shown below) to connect the various MIDI components to each other:

Figure 1.


Notice the “Connect” and “Patchbay” buttons at the lower-left, above.

I connect the MIDI instruments as shown in the screen-shot below, which appears (or disappears) when you click the “Connect” button above.


The curved lines between the two sides of the window show what component is currently connected to what other component.

To make a connection in the “Connections” window, you first click on a component in the left side of the window (a readable client), then click on a component on the right side of the window (a writable client) – which side you click first doesn't matter.

After doing that, if they aren't already connected, the “Connect” button (at the bottom-left of the window) will be enabled (not grayed-out), and if you click on the “Connect” button, the components will be connected.

On the other hand, if the two components you clicked on were already connected, the “Disconnect” butten will be enabled, and if you click it, the components will be disconnected.

In the picture above, notice that the KeyMusician-Keyboard “KMK-Output” sends to both Qsynth1 (the foreground synthesizer), and the qmidiroute input port (the MIDI filter). Also, qmidiroute sends to Qsynth2 (the background synthesizer).

So everything I play on my keyboard goes to Qsynth1, and also to Qsynth2 (after passing through the qmidiroute MIDI filter).

Although you can make these connections each time, as described above, to make it easier, I save these connections as a patch-bay.

The “Patchbay” window (shown below) appears (or disappears) when you click the “Patchbay” button of the JACK Audio Connection Kit window (shown in Figure 1 above).

The patchbay connections (as shown below), get used automatically any time the “Activate” toggle-button is selected, as shown in the screen-shot below. The setting of the “Activate” button is remembered from your prior session.


The curved lines between the “Output Sockets” and “Input Sockets” panes, show what will connect to what (if the two components are present).

In the patchbay above, qmidiroute (it assumes its first sub-component, namely “out 1”) will connect to Qsynth2 (if it is present), and that KeyMusician-Keyboard (its first sub-component, namely KMK-Output) will connect to qmidiroute (its “in” sub-component), if it is present.

So the first piece of 'magic' is using JACK (qjackctl) to connect components together. The second piece of 'magic' is the MIDI router and filter, qmidiroute. It receives MIDI messages in its input port (a port can use all 16 MIDI channels), and selectively sends those messages on its “out 1” or “out 2” ports. In the case documented here, the “out 2” port is not used.

Here (below) are the various panes (tabs) of the qmidiroute configuration, with comments on what each of them does.


The “Unmatched” tab (above) indicates that any MIDI event that is not matched (by any of the other tabs) will be discarded. The “Event Log” text-area shows all MIDI events that came in on its input port.

This means that the “Sustain” controller events (not matched in any of the tabs below) will be discarded, rather than being passed to the “out 1” port.


The “Notes” tab specifies that all MIDI “Note” events (note-on, or note-off, 0 through 127), on every MIDI channel (1-16), are passed as “Note” events, without modification, to its “out 1” ALSA Port. These events are passed on the same channel (1-16) they came in on. The velocity of each Note event (0-127) is also passed without modification.


The “Volume” tab (above) specifies that all MIDI “Controller” events for controller 7 (Volume), on all 16 MIDI channels, are passed unmodified to its “out 1” ALSA port.


The “Balance” tab (above) specifies that all MIDI “Controller” events for controller 8 (Balance), on all 16 MIDI channels, are passed as MIDI Controller 11 (Expression) events, to its “out 1” ALSA port.

Controller # 8 values (on input) are changed to Controller # 11 values by adding the Controller Offset value of “3” to it. For some reason, specifying a fixed value of 11 on the output side didn't work.

The remaining screen-shots deal with changing any input program-change (instrument change) MIDI event on a given MIDI channel, to its proper background instrument patch-number value, passed on to the output port on the same MIDI channel.


The “PC-Chords” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 1 (regardless its value), will be passed as a Program Change event with a value of “1” (1-Bright Yamaha Grand).


The “PC-F2” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 2 (regardless its value), will be passed as a Program Change event with a value of “48” (48-Strings).


The “PC-F3” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 3 (regardless its value), will be passed as a Program Change event with a value of “52” (52-Ahh Choir).


The “PC-F4” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 4 (regardless its value), will be passed as a Program Change event with a value of “93” (93-Metal Pad).


The “PC-F5” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 5 (regardless its value), will be passed as a Program Change event with a value of “91” (91-Space Voice).


The “PC-F6” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 6 (regardless its value), will be passed as a Program Change event with a value of “52” (52-Ahh Choir).


The “PC-F7” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 7 (regardless its value), will be passed as a Program Change event with a value of “48” (48-Strings).


The “PC-F8” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 8 (regardless its value), will be passed as a Program Change event with a value of “93” (93-Metal Pad).


The “PC-F9” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 9 (regardless its value), will be passed as a Program Change event with a value of “52” (52-Ahh Choir).


The “PC-F10” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 11 (regardless its value), will be passed as a Program Change event with a value of “52” (52-Ahh Choir).


The “PC-F12” tab (above) specifies that any MIDI “Program Change” event received on MIDI-channel 12 (regardless its value), will be passed as a Program Change event with a value of “93” (93-Metal Pad).

So that covers the configuration for qmidiroute. You can download that configuration (along with others) at the end of the article.

The remaining configuration to fit with the above, is for the KeyMusician Keyboard. The following screen-shots illustrate the KMK configuration to match with the qmidiroute configuration screen-shots above.


In the “F1 (Help/Setup)” pane above, MIDI Output events are being sent to Qsynth1. The JACK Patchbay makes the other connections without having to specify anything here.

Notice that the KeyMusician Keyboard Version is “1.20”. You need at least this version of the software to avoid a bug (fixed recently). Without this fix, the sound from the FluidR3_GM sound-font would be distorted if the assignable “8-Balance” slider is non-zero.

The details of the above-mentioned bug that is fixed in 1.20, can be read here. If you don't have version 1.20 or greater, please re-install the application before trying to use the configuration described in this article.

Also notice above, that the “Customize Look-and-Feel” drop-box has “Nimbus” selected, rather than “GTK+”, which would normally be used on Linux.

The reason for this, is that Open Java on Ubuntu 15.10 has a bug that causes the KMK application to hang during initialization. Hopefully, they'll fix that soon. That bug is documented here.

Also notice (from the Title-Bar, and also the “Configuration File” drop-box), that the “CompositeVoiceBalance-Numbus.kmk” configuration file is used (which you can download at the end of the article).


The chords pane (above) sends on MIDI channel 1. Notice the ASSIGNABLE slider (assigned to the “8-Balance” controller) is set to the right of the half-way point. This is because I want the Grand Piano background sound to be more prominent than with other background sounds.


The “F2” pane sends on MIDI Channel 2. Notice that the ASSIGNABLE slider (8-Balance) is set at the half-way point.


The “F3” pane sends on MIDI Channel 3. Notice that the ASSIGNABLE slider (8-Balance) is set at the half-way point.


The “F4” pane sends on MIDI Channel 4. Notice that the ASSIGNABLE slider (8-Balance) is set at the half-way point.


The “F5” pane sends on MIDI Channel 5. Notice that the ASSIGNABLE slider (8-Balance) is set at the half-way point.


The “F6” pane sends on MIDI Channel 6. Notice that the ASSIGNABLE slider (8-Balance) is set at the half-way point.


The “F7” pane sends on MIDI Channel 7. Notice that the ASSIGNABLE slider (8-Balance) is set at the half-way point.


The “F8” pane sends on MIDI Channel 8. Notice that the ASSIGNABLE slider (8-Balance) is set at the half-way point.


The “F9” pane sends on MIDI Channel 9. Notice that the ASSIGNABLE slider (8-Balance) is set at the half-way point.


The “F10” pane sends on MIDI Channel 11. Notice that the ASSIGNABLE slider (8-Balance) is set at the half-way point.


The “F12” pane sends on MIDI Channel 12. Notice that the ASSIGNABLE slider (8-Balance) is set at the half-way point.

Finally, here are the configuration files used in this article:

Right-click on each of the links below, and select “Save Link As” (or whatever similar your browser uses) to download the file the link points-to. Don't left-click on the links!

The qmidiroute configuration explained in detail above:

CV-Balance.qmr

A qmidiroute configuration where all of the background instruments are 52-Ahh Choir:

CV-Balance-Choir.qmr

A qmidiroute configuration where all of the background instruments are 93-Metal Pad:

CV-Balance-MetalPad.qmr

A qmidiroute configuration where all of the background instruments are 48-Strings:

CV-Balance-Strings.qmr

The KeyMusician Keyboard configuration file for the screen-shots above:

CompositeVoice-Balance-Nimbus.kmk

Give it a try. You can get some really amazing sounds this way, using just a General-MIDI sound-font, and ordinary synthesizers.

On Windows & Mac, similar things can be done by chaining VST instruments and effects together, and/or by VST instruments listening on different MIDI channels.

Index Of All Newsletter Articles