DSP Module for Aleph Sound Computer
With this program loaded onto the blackfin dsp, the aleph readily transforms between any of the following digital music devices:
- live performance sampler
- pitchshifter
- chorus/flanger
- rudimentary Karplus-Strong resonator
- echo
- pitch & amplitude tracking synthesizer for monophonic signals
- pitch/volume tremolo
- ring modulator
- FM-synth-like processing of monophonic signals
Many variations, permutations and combinations of these basic functions may be realised through static combinations of grains’ 84 parameters. The specification of these parameters is given below:
CV Params {1, 2, 3, 4}
Source-cv-[n]
Choose source for CV out n from patch matrix
ADC mix params {1, 2, 3, 4}
ADCs 1 & 2 are hard-wired to mixer channels 1 & 2, whereas mixer channels 3 & 4 select their source from the patch matrix.
fader-i[n]
Stereo fader from mixer chan n to DACS 1&2
pan-i[n]
Stereo pan from mixer chan n between DACS 1&2
effect-i[n]
Send from mixer chan n to effect bus
aux0-i[n]
Fader from mixer chan n to DAC3
aux1-i[n]
Fader from mixer chan n to DAC4
source-i[n]
Choose mixer channel input from patch matrix
Grain Mix params {1, 2}
source-g[m]
Choose grain input from patch matrix
fader-g[m]
Stereo fader from grain m to DACS 1&2
pan-g[m]
Stereo pan from grain m between DACS 1&2
effect-g[m]
Send from grain m to effect bus
aux0-g[m]
Fader from grain m to DAC3
aux1-g[m]
Fader from grain m to DAC4
phase-g[m]
phase of grain m (+ve or -ve)
lpf-g[m]
Cutoff frequency (in Hz) for grain output (low-pass filter)
Grain Modulation Params {1, 2}
FM-source-g[m]
Choose a signal from patch matrix to modulate scrubPitch of grain. If scrubbing disabled, FM becomes PM (modulating read position relative to echotap).
FM-level-g[m]
Set depth of modulation induced by FM-source
AM-source
Choose a signal from patch matrix to modulate amplitude of grain output.
AM-level-g[m]
Pan between modulated and unmodulated grain output.
Grain Scrub params {1, 2}
scrubEnabfle-g[m]
enable scrubbing behaviour for this grain (pitch control independent of echo speed).
scrubPitch-g[m]
speed of scrubber read tap in subsamples (1/256 sample) - bees displays 1.000 at speed = 1 sample/sample
scrubLength-g[m]
length of scrubber read distance from echo readhead before cross-fading. This is expressed as a ratio to the scrubberFadeLength
scrubPitchDetection-g[m]
When this is enabled, scrublength ‘snaps’ to an even multiple of grain input signal. Zero crossing pitch detection with adaptive filter.
Grain Echo params {1, 2}
echoFadeLength-g[m]
length for scrubber crossfades. Again expressed as a ratio to echomax-echomin
echoTime-g[m]
allows bees to force read head to a point, e.g:
- set echo time for simple echo fx
- trigger one-shot (stalled) sample for pre-recorded audio
echoSpeed-g[m]
For canonical realtime FX like this guy should be 1, so the echo-tap stays in sync with write head. When a sample is loaded into the fifo this guy replays the sample. See echoEdgeBehaviour for playback modes. If you’re feeling crazy unglue the echo tap from writing head while write head runs by setting this value != 1
echoEdgeBehaviour-g[m]
set this to 0 or 1 to control does echo-tap head stall, or wrap at echo boundary respectively? Also possible to retrigger one-shot samples by resending 0.
echoMin-g[m]
echo boundary nearest to write-head
echoMax-g[m]
echo boundary furthest from write-head
writeEnable-g[m]
Choose between constantly writing new data into echotap or simply re-playing already-recorded audio in the underlying buffer.
Grain Pitch & Amplitude Analysis / Tracking {1, 2}
envAttack-g[m]
Attack of the envelope detector - this control is a little rough round the edges but it kinda works. Broadly speaking smaller number -> slower attack.
trackingEnv-g[m]
Multiply PitchTracking Oscillator by grain envelope befre sending it to patch matrix.
trackingPitch-g[m]
Frequency Offset factor for pitchTracking oscillator/synth
Grains Utilities
LFO-speed
Speed of LFO (smaller number = slower oscillation down to very slow oscillations. LFO signal is output to patch matrix.
LFO-shape
Blend between a triangular LFO shape (0) and sinusoid shape (max)
noiseBurst
Trigger a noise burst impulse into patch matrix
noiseBurstDecay
How quickly does noise burst impulse decay (small number = long burst)
static-CV1
Set a DC value from BEES on static-CV1 slot in patch matrix
static-CV2
Set a DC value from BEES on static-CV2 slot in patch matrix
Patch Matrix
The astute reader will notice a number of cryptic references to a so-called ‘patch matrix’. This allows the program to be internally re-wired, much like patching a modular synthesizer. Patch index denotes an output & each patch-matrix-enabled input may choose one source from the patch matrix.
Patch matrix Cheatsheet:
- Effect Bus
- ADC 1
- ADC 2
- ADC 3
- ADC 4
- grain1 output
- grain2 output
- grain1 echoTap pitchtrack oscillator
- grain2 echoTap pitchtrack oscillator
- grain1 echoTap envelope
- grain2 echoTap envelope
- LFO
- noise burst
- static-CV1
- static-CV2
Grain Anatomy
A grain consists a buffer, a write head running at 1x, an ‘echoTap’ & a ‘scrubTap’.
The echoTap is like a lines read head but it can run at non-integer speeds, it’s time coord is relative to the write head (wrapping round the underlying buffer is hidden). However playback speed remains relative to the underlying buffer. The echoTap also functions like a live performance sampler - writeEnable=0 allows to ‘freeze’ the current contents of the echotap buffer, enabling sampler playback, which can be looping or one-shot.
The scrubTap is a classic rotating-head pitch shifter temporally indexed relative to the scrub tap and with a fine-grained time coordinate. When ‘scrubbing’ is disabled, the scrubTap becomes simply a fine-grained delay. ‘FM’ becomes ‘PM’ in this case, modulating by some proportion of the scrubLength.
Also bolted on to each ‘grain’ for good measure is a built in pitch-tracker, envelope detector & a monophonic tracking synthesiser harnessing these two signals.
Bugs!?
Please send bug reports and/or patches to sasquatch@rickvenn.com or github.com/rick-monster/aleph.