Skip to content

Instantly share code, notes, and snippets.

@schollz
Created March 21, 2024 16:42
Show Gist options
  • Save schollz/ad2ba9dbaf221d9fdd1bb8f0b81d1363 to your computer and use it in GitHub Desktop.
Save schollz/ad2ba9dbaf221d9fdd1bb8f0b81d1363 to your computer and use it in GitHub Desktop.
(
s.waitForBoot({
{
arg freq = 220;
var resFreq = freq * 1.5;
var sr = SampleRate.ir;
var baseFrequencyPeriod = sr / freq;
var resFrequencyPeriod = sr / resFreq;
var baseFrequencyCounter = Phasor.ar(
end: baseFrequencyPeriod,
);
var resFrequencyCounter = Phasor.ar(
trig: baseFrequencyCounter < 1,
end: resFrequencyPeriod,
);
var sineWave = (2 * pi * resFrequencyCounter / resFrequencyPeriod + (1.5 * pi)).sin + 1;
var invertedFreqCounter =
(baseFrequencyPeriod - baseFrequencyCounter);
var sound = sineWave * invertedFreqCounter;
sound = (sound / resFrequencyPeriod) - 1;
sound = LeakDC.ar(sound);
[baseFrequencyCounter,
resFrequencyCounter,
sineWave,
invertedFreqCounter,
sound
]
}.plot(1.2/220);
SynthDef("casio",{
arg freq = 220, gate = 1;
var resFreq = freq * SinOsc.kr(Rand(1,4)).range(1,5);
var sr = SampleRate.ir;
var baseFrequencyPeriod = sr / freq;
var resFrequencyPeriod = sr / resFreq;
var baseFrequencyCounter = Phasor.ar(
end: baseFrequencyPeriod,
);
var resFrequencyCounter = Phasor.ar(
trig: baseFrequencyCounter < 1,
end: resFrequencyPeriod,
);
var sineWave = (2 * pi * resFrequencyCounter / resFrequencyPeriod + (1.5 * pi)).sin + 1;
var invertedFreqCounter =
(baseFrequencyPeriod - baseFrequencyCounter);
var sound = sineWave * invertedFreqCounter;
sound = (sound / resFrequencyPeriod) - 1;
sound = LeakDC.ar(sound);
sound = sound * EnvGen.ar(Env.adsr(0.1),gate:gate,
doneAction:2);
sound = Pan2.ar(sound, SinOsc.kr(Rand(0.3,0.7),Rand(0,2*pi),mul:0.5));
Out.ar(0,sound*0.1);
}).add;
});
)
(
// sequence
~crdStr = [["e1", "e2", "b3", "d4", "g4"],
["g1", "g2", "b3", "d4", "f#4", "a4"],
["b4"],
["a1", "a2", "c4", "e4", "g4"],
["c1", "c2", "g3", "e4", "g4"]
];
// Map from chord names to midi notes
~noteToMidi = {
arg noteStr;
var notes = Dictionary[
"c" -> 0,
"c#" -> 1,
"d" -> 2,
"d#" -> 3,
"e" -> 4,
"f" -> 5,
"f#" -> 6,
"g" -> 7,
"g#" -> 8,
"a" -> 9,
"a#" -> 10,
"b" -> 11];
var octave = noteStr.last.digit;
var degree = notes[noteStr[..noteStr.size-2].postln];
octave*12 + degree;
};
~crdArray = ~crdStr.collect{
arg crd;
crd.collect{|c| ~noteToMidi.(c)};
};
Pbind(
\instrument, \casio,
\freq, Pseq(~crdArray+12 , inf).midicps,
\dur, 60/180*8*Pseq([1, 0.375, 0.625, 1, 1], inf),
\sustain, 60/180*12*Pseq([1, 1, 0.625, 1, 1], inf)
).play;
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment