Snapping a signal to musical scale?

vojko v's icon

Is it possible to "snap" a signal to a desired values?

Let's say I have [rand~ 0.5] and after it [scale~ -1 1 0 2000] and this controls a frequency of an oscillator and the signal flies around randomly between 0 and 2000 Hz, but I want it to gradually slow down at desired frequencies of a musical scale and eventually totally stop at these frequencies, something alike sample and hold.

How do I achieve this?

Roman Thilenius's icon


i would use [trunc~] to truncate to full integers - or [round~] to round to the next integer - and then you can use [+~] to remap these integers to every value you wish.

same story as with [mtof~] output.

Roman Thilenius's icon


oh wait, i forgot something.


Roman Thilenius's icon


so, for major and minor you could use the signal version of [110.chrom2majmin] - which does this:

expr (((($i1+((($i2==1)*5)+1))*12)/7)-((($i2==1)*9)+1))+$i3

for the signal version, copy the blue patch. (ignore the missing subpatch)

input:
signal (notenumber), major/minor 0/1, transpose 0-11 int

output:
signal (diatonic scale)


if you want to use more church modes than major and minor, simply add numbers to the the [* 5]---[+ 1], but replace [* 5]---[+ 1] by a [+ 5] and substitute the 0/1 input from the toggle with a menu with the numbers of a diatonic scale (or with all 12 keys from 0-11 if you think its fun)

expr ( int((notenumber + 1 + mode) * 12) / 7 + 3 + transpose )

as you can see, ionian - or modern-major - will be "+6" already, that is where the * 5 comes from.

vojko v's icon

thanks, ill check a lot it out