White Key Scale Play

One bell and one whistle: A little RGB light and readout to tell you if your last key hit was on the tonic–which you would have set when setting key–or else how far away (in white keys) and in what direction. Red means you’re below it. Blue means you’re above it. Green means you’re on it. Otherwise same functionality. This is primarily useful if you’re using a 25-key controller and/or short scales.

White Key Scale Player Module v19.01.24.2.audulus (195.4 KB)

White Key Scale Module DEMO 8.audulus (1.8 MB)


The keyboard for the demo was using midi channel 16. I switched it to Omni.

1 Like

Using the White Key Scale Player with on-the-fly scale swapping, scale bend, and in-scale bend

I decided that I wanted to be able to switch scales on a recorded looping sequence and have everything play properly. To do that I needed to record degrees of scale and octave, relative to the current key, rather than final intervals, which are basically set in stone.

Here’s a new clip, Done in A, pentatonic minor scale, demonstrating the “scale bend” and “in-scale bend” features. By “scale bend” I mean changing scale mid-song, with a loop already running. By “In-scale bend” I mean performing pitch bends that obey the current scale, rather than chromatic (or unquantized).

The main feature of this song is done by bit-rotation of the pentatonic scale, which has two empty chromatic tones from the first to the second degrees. That allows a one-bit then two-bit rotation to provide the lift (one bit rotetion) and drop back halfway down (2-bit rotation) to the ground (no rotation). I assigned the rotation fo my modulation wheel, limiting the patch to to two-bit max rotation over the 0 to 1 mod wheel range.

I’m posting this here because it has more to do with playing various scales than anything else.

White Key Scale Player - Tones Only 05.audulus (2.0 MB)

White Key Scale Player Demo

Demo features

  1. White Key Scale Player — maps any scale, from 1 to 12 tones — to the white keys only.
  2. 16-step looper — tap-tone, with a sustained tap removing earlier-recorded tones—up to and including itself if held down for one entire cycle of the looper (thus clearing the looper). Looper records tones in the sparkling new (and possibly unnecessary) hybrid format, with octave (above or below tonic octave) as a positive or negative integer, and a two-digit degree of scale to the right of the decimal point. If you switch scales while recording or playing a looped arpeggio, the loop will continue to play saved degrees of scale and octave offset from tonic from the sampler and set them to the new scale. After reconstituting in-scale tones from the sampler, the tones are then set to the saved key.
  3. In Chromatic mode, gate pulses to the looper are disabled.
  4. Solo channel has a new in-scale bend feature to give quantized bends, over a two octave total range, with a button to allow free-form bends over the same range. Chromatic bend can be done as well.
  5. Added a “scale bend” module, which in my setup is controlled by the modulation wheel. The default is zero, which leaves the scale unchanged. Maximum rotation is 11. Rotation is in one direction, with a rotation of one bit dropping the 2^nth bit to the 2^(n-1)th position, and raising the 2^0th bit (the tonic) to the 2^11th position. Since the scale queries and quantization modules honor the actual position
  6. Modified Pseudo Phaser, with a ModF input the set the rate off the LFO. A knob (set for me to track the modulation wheel) allows multiple parameters on the Pseudo Phaser to be controlled by the one midi controller wheel.
  7. Randomly (normally distributed about a mean) generated LFO for effects, the randomness coming by dividing the clock by random amounts. The internal phaser’s 0 to 2pi ramp is run through a spline to allow some wave shaping by dragging it around.
  8. A Hi/Lo velocity router, run from the LFO. LFO is scaled to span the range of velocities recorded, with the scaling performed anew with each new sample added to the looper. The router has two main outputs, one for hits higher than the current velocity threshold and another for those lower, that were rejected by the upper. Both can be turned off if desired.
  9. Two in-scale random tone walk generators (again normally distributed so they will have a melodic “home”) that add tones above or below the looper output. These also have a “follow the solo” mode that raises the current walk tone by the degree and octave being played.
  10. The scale selector now has lights to indicate the chosen scale. The selector has an external scale input which is fed by a custom scale input patch (which has independent scale display lights for reference . A value of zero at the ext input --no buttons pressed-- is interpreted by the scale selector patch as an instruction to use the scale indicated by the dial setting.
  11. Latest tap-tempo module. Larded up with new features. Open up the patch to read all about it. When you apply a trigger, it takes a five beats to complete its calculation of tempo. To change tempo, set the new drum machine tempo, then press the reset button for one second. The new tempo will be reached from 1 to
  12. Audio Beat Detector — basically a high-gain, tight bandwidth gain stage with an adjustable frequency and trigger level. I originally tried it as a handclap detector, but now it’s set to respond to the sync pulses from the drum generator.

Black Key Patch Bay

  • C# — connects the button-scale output to the scale selector’s ext input.
  • Eb — applies triggers from the scale player to the looper.
  • F# — enables the random tone walk feature.
  • Ab — enables the “follow the solo” mode.
  • Bb — connects the clock source to the tap-tempo generator.

Your music theory mathematics are next level dude! If I can learn a fraction of that amount in my lifetime, and figure out how to (usefully) apply it, I will be happy with myself lol. Great setup! :slightly_smiling_face:


Clearly the work of a mad scientist! I love it! :clap:


Hey! Thanks for that! The math is not all that bad, though! The scale is laid out for my (and other peoples’ quantizers) like bits in a computer, with the smallest value (the Least Significant Bit, or LSB) representing the tonic of the scale. Normal scales will always have a tonic, or root to be the first tone in that 12-possible-tone scale.

My bit rotation slides them all down, so a shift of one bit for any normal scale will make the tonic disappear and reappear at the last tone in the rotated scale (for a pentatonic scale, that’s tone or degree 5.)

Important for the sound of this demo song is that my quantizers don’t force the first tone of any scale into the bottom. If the first tone is a rotated scale is at three halfsteps (aka three frets) up, then my quantizer or my scale lookup functions will output the third tone of the chromatic scale. So when I rotate the tonic of the pentatonic scale one bit down, to set it to the 5th tone position, that leaves two empty slots in the lowest two positions of the rotated scale, meaning that the first tone (degree one, to the tonic) will play two tones higher. Rotating one more step back puts that first tone one step closer, but it still leaves one empty step from the LSB, so the C key note will now play one half step higher than than tonic instead of two.


That is really impressive, and may seem simplistic to you, but I am not one for pretending that I understand things when I do not, and I try to always give credit where it is due. I’m not trying to put myself down (too hard lol) and say it is out of my comprehension or something, but I am for sure saying that I would probably need a chart to plot out what you just described to me haha cuz that is a super intense maze of words I understand separately, but as a couple paragraphs, my comprehension of the statement ended at:

Everything after that, may as well have been Portugese, in my brain, trying to make a mental picture of all of it. As such, your scale patch revisions are each that much more impressive :slight_smile: Great job! Maybe if I download and try to go through this new one, I won’t feel quite as over my head as I felt with the last one. It has been a few months and a lot of experience since I first gave the comprehension of the previous version a once over.

Anyway, thanks for the reply, and keep the impressive inventions coming! Your videos are fun to watch, and listen to, and I like the choice of beat keeper hardware, as I am a big fan of the Volca family of devices since buying a Volca Modular a few months ago. I like seeing them in well made demos of stuff that others are also using them for. Also, I am looking forward to Korg releasing that Nu: Tekt DIY synth kit they demo’d at one of the music trade shows this year! Have you seen that thing? If not, check it out! Have a great day and happy patching, my friend! :wink:


Oh, that Volca Beats is so easy to use–i was tempted to go off and get 'em all! Reason prevailed–for now at least!

As for the music logic stuff. All good. It’ll make more sense when you try it, and the scale bend patch has a row of digits, with a 1 meaning there’s a tone and a zero meaning no tone. They slide around as you rotate the scale.


Sounds great!


I added the ability to do clockwise as well as counterclockwise scale bends, and repurposed the Bb key to switch from cw to cow.

Tempo source is now connected via the normally closed leg of my SPDT switch patch.

White Key Scale Player - Tones Only 06.audulus (2.0 MB)

As it’s uploaded, the demo has the scale bend limits set from 0 to one bit, counterclockwise. Goofing around, I noticed that shifting the mixolydian scale by one bit has a very jazzy quality about it.

Thinking more about it, all this bit shifting is nothing more than moving everything up or down a fret on a guitar, or moving the fingers up or down a key on the piano. How is this not equivalent to just bending the key? I’ll have to work on that!


New version. Fixes a minor problem and adds a feature that makes it more “performance friendly,” if you care about that sort of thing.

White Key Scale Player - Tones Only 07.audulus (2.0 MB)

I found an error in the hybrid oct.degree + key to standard octave conversion module for playback of a loop using a shorter scale than it was recorded through, where some recorded degrees of scale exceed the size of the scale you’re now using. Now, those tones go into a higher octave, as you would expect. Any degrees that fit in the playing scale will fold back to the base octave. (The converter does not attempt to guess whether an in-scale tone being played back was intended in the next octave up.)


I don’t like hearing all the interim scales play as I’m searching for just the scale I want, so I adopted a feature I use in my BPM selector (seen elsewhere.) I added a feature to the scale selector that allows you to select a new scale and when you want it to take effect you hit a button (or learned midi control) to bring it “online” for playback. Internally, when you change the scale, it is latched into a “pending” S/H and is only latched to the output S/H when you hit the trigger (a power-on autowhacker is provided as well so you don’t come up with no scale selected). The button is on the lower left of the scale selector. External scales from the manual control do not trigger the latched, since you can just apply the external scale at will by hitting the C# key.


Here’s the change detector/latcher module:

Here’s the power-on whacker. It’s new and improved. Much lower processor hit than my previous. If this does not work for you, please let me know!

No demo song right now, as the change to the innards, although changing the sound a little, do not make that much impact. The old converter still played everything in-scale, and really, In the area of music-making, utter accuracy or utter consistency is not necessarily a goal. If you like the “broken” version better, go for it!

I changed the beat detector settings to detect a handclap. If you clap five times, about a second apart, the tap tempo will output about 240 bpm. The MIDI keyboard is set to AUTO, but for my use it’s set to channel 16.

I moved the loop record on/off over to Bb, freeing me to put the new cw/ccw bend switch onto Eb. Tempo source off/on is now a dedicated (normally on) MIDI trigger, rather than a black key.

I must say that I’m having lots of fun making funky little ditties with scale bend, but I really just created this to make it more fun to practice playing guitar over various scales.


Last time, I’d converted to arpeggio recording in octave.degree format to allow changing of scale on the fly. Another goal was to play progressions, which is what I’ve done here.

White Key Scale Player - Tones Only 10.audulus (2.0 MB)

I modified my old 1- to 16-bar progression machine to provide output in the oct.deg format. The progression machine outputs octave above or below key and degrees of scale of the progression in the same oct.deg format used elsewhere in the project. At the first degree (aka the tonic), in the octave containing the original key note, the output from the progression machine would be 0.01 (corresponding to a green octave light with a degree 1–note that red indicates one octave below, blue- one above, and violet- two above).

I also tightened the clocking of the progression machine to allow synchronizing on a particular loop sample. To ready the machine for synchronizing, pause it (pause button below), then hit reset. To synchr-start the machine at a particular point in the loop, hit pause again at that moment. The loop can also synchro-start when you record a sample into the loop, for instance when you have an arpeggio you want to start on the first beat of each bar.

To save CPU I’ve dumped the averaging tap tempo patch and converted to a simpler clock multiplier.

The walks follow the progression. All of the in-scale operations—setting to a key, stepping through a progression, random walks off of a progression, and in-scale bends for the solo channel—work in the same way. This video demonstrates all of them, with a progression in G, moving along the Mixolydian scale.

Basically, a scale sits atop a base tone— the key. Quantizer and scale look-up output adds to the key tone. To play the first degree, the quantizer or scale lookup outputs a zero for the first degree, meaning that the key note is what is output. Playing Notes higher up the scale, the unique interval for that degree of scale (plus or minus any octave shifts being played) add to the key for final output.

Progressions at higher degrees of scale and in-scale bends play out fundamentally the same way, with two important differences.

One difference is that when doing walks around a progression step, or bending a note currently being played, the base tone is now the key, plus the interval of the progression step or the interval of the current note being played.

Keeping these bends or walks in-scale brings us to the other difference—scale rotation. For each step in a progression, the scale is shifted to place that degree of scale at position one. This way, a 1-3-5-7-9, etc, arpeggio will naturally play using the unique chord intervals found starting at that degree of scale. In essence the scale never moves relative to the original key—we jack up the key and jack down the scale and allow the same arpeggio (or bend) to play from that point.

(You can probably see why I switched all A440-based Audulus octave signals to a C-basis inside the white-key module. I found it MUCH easier to wrap my brain around a tone encoding system that matches the C-based piano keyboard!)

Other changes:

The scale bend is retained, set here for a 0 to 2 step range set, defaulting to counterclockwise (pattern shifts to the left.)

I added foot pedal control, with sustain settings for pedal down and pedal up, and a button to reverse the action of the pedal.

I’ve added a 5th mono input to my mixer, and a stereo effects loop of sorts. The 5th input is being used to mix in the monophonic output of the drum machine.


Impressive piece of work! :cowboy_hat_face:



I’ll show you impressive! Feast your eyes on this thing of beauty!

I had the surprisingly nice satellite units left over from a dead and cannibalized Klipsch 2.1 set, so my horrible Rocketfish 2.1 computer speaker system got Frankensteined.


holy. Nice to see the video with you adding the notes. The ‘track’ is wicked on its own. Got that back in the day hook.



  1. Foot pedal control with external input to allow automation.
  2. Added “rand?” and “[0-1]?” inputs to the noisy knob patches. The first directs the patch to apply the variance set on the middle control. The second directs the patch to scale all variance within the 0-1 mean range (by scaling the tails separately, as before). In the project, the LFO randomizer copy of the patch is set to scale the tails and to randomize. The other use of the patch is for setting interval and variability for walks around the target interval (note that output can go negative for these, which just places a tone below the root.)
  3. Added a patch that breaks out progression machine rows and columns (fixed at 4x4) and odd/even bar, then created a block of AND and OR gates that can be used to turn on or off various things. I have one set modulate the footswitch (decay time on the synths) and another tap to enable or disable walks from the set intervals on the two walkable slaved synth channels.

  1. Fixed a problem with the White Key patch where changing the key would sometimes leave you in the wrong octave.

  2. Cleaned up pause/resume patch for the progression machine. Pause with a pulse to the pause input. Hit resume or tap a white key in recording to sequencer mode and the progression steps begin at the current time slice.

White Key Scale Player 11.audulus (2.1 MB)

1 Like

This is a repost to the end of the thread, with description correction and a small update to improve responsiveness to pad/trigger presses by the progression machine.
The big deal for me here is that I made my first state machine in Audulus! I also changed the way the velocity router works, added my “steel drum” modified res-drum in parallel with the little Smol synths, and added the ability for the tunable res drum synths to respond to interval-scale changes in tone (such as with quantized bends) as well as the normal midi trigger input.

White Key Scale Player 15.audulus (2.5 MB)
Progression Machine

Attempts to add some meaningful pause and reset functionality led to some really funky and buggy point to point logic, timers, and other ugly and expensive workarounds. I decided this a great time to try implementing a state machine approach.

The state machine was implemented using two 8-input multiplexers as the state and corresponding parameter calculation selectors, each feeding a S/H. State IDs are integers from 0 to 7, assigned arbitrarily, with some abstraction provided by packing that number into little “stateID” patches, each displaying its name and an ID number with 1 added to match the numbering of the mux component. The state machine is clocked at a multiple of the tempo clock to allow the switch between states to be done in less than one beat.

There are two stable states—running and paused. All other states are temporary, during which initial conditions are being set for the beat counter. By far the hardest part was capturing the trigger taps that cause the state changes. The solution was to generate pulses from the triggers hit by the user that are long enough to be captured by the stable state during which they tapped, but not so long that they are still true when you return to the final stable state.

The progression machine initializes paused at bar 1.

  1. Paused state. When pause is pressed while the progression machine is running, the beat counter is set to the the last beat in the current bar during the “pausing” state. Un-pausing will play the next bar immediately. Hitting pause while paused switches the state to “running,” where the beat counter is incremented by 1 for each tempo clock cycle. While paused, you can return to bar 1 by hitting “reset” or step up or down a bar by hitting “fwd” or “rev.” Steps forward roll past the last bar and reverse stepping continues past bar zero.

  2. Running state. In running state, hitting reset or pause will pause on the current bar.

3. Changed how the loop trigger velocity router works. Now, the output for velocities lower than the moving threshold are found independently from the those above it, and for both the “looseness” number is now variable, with a control brought out. A minimum looseness value guarantees that the highest and lowest velocities will trigger an output when the knob is set to zero. The higher you set the value above zero, the more triggers will be sent to both outputs, playing them in unison rather than separately. The lowest and the highest loop velocity will still only be sent to the one synth only, so long as that velocity routing for that channel is enabled.

  1. Since the output for “velocities lower than threshold” would by definition put out quieter hits on average than the “…higher…” output, I added the option to convert all the pulses from that “lower than threshold” output to be the inverse of the actual velocity recorded into the looper—the highest being converted to lowest and vice versa. This has the effect of balancing the volume between the two adjustable interval outputs, and adds another element of surprise, as a soft midi keyboard hit into the looper will be surprisingly loud on the “lower than” output.

  2. Added a pad that creates markers for the progression steps/bars from the progression machine, with true/false outputs as follows (assuming four progression steps/bars per row): odd (bar 1,3,5…15); even (bar 2,4,6…16); row 1, 2, 3 ,4; and column 1, 2, 3, 4. Then I added some logic gates to allow automatic control of player characteristics based on combinations of these markers.

  3. I wanted a more punchy or sparkling sound while retaining the sustain and tone of the SMOL synths, so in parallel to each SMOL synth I added one of my tunable res drum synths (based on the Res Drum library module), with its octave adjusters all ganged together and set to place them at some octave relative to whatever is being fed to each regular synths. A mix control (also ganged for all channels) lets you set the mix of synth to drum sound.

  4. The res drum now responds to step changes in tone greater than 1/24th of an octave as if it were a gate input. This allows quantized bends to generate a drum output. Velocity used for these triggers is the last actual trigger velocity it saw.

Video of me noodling around, showing basically how it can sound:


Cleaned up the design a little by grouping the three “chording” or “loop” synths separately from the solo synth (with two quad signal lines to carry eight control signals), added a way to latch parameters for the loop synth, then play solo with some different voicing. Basically you set up the looper voicing. By this I mean you set the voicing of both oscillator and resonant synth, the mix of oscillator vs resonant synth in the output, the offset in octaves of the resonant synth to the oscillator synth, and the attack and decay of the oscillator (Smol) synth. These parameters can be latched, so the solo can sound different from the looped sequence. You still set up the triad intervals at any time.

I added a similar latching for the scale. The looper scale can be latched so that the solo can be played to a different scale.

Also cleaned up the progression machine a bit.

White Key Scale Player 16.audulus (2.6 MB)

This little video demonstrates using different settings for the looper channel from those for the solo. In the video, the looper is playing in Dorian, and the solo is played in minor pentatonic (a subset of Dorian).


Lovely melody you play in the video and an amazingly intricate patch as well. I have to admit the white keys are like world unto themselves.


Thanks! Yeah, The white keys thing is perfect for me, as I understand some rudimentary music theory and I love keyboard-based music but I can’t play piano at all!

1 Like