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.
-
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.
-
Running state. In running state, hitting reset or pause will pause on the current bar.
Elsewhere
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.
-
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.
-
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.
-
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.
-
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: