in case this is useful… (run the first paren’d block to create a rudimentary sea space and define tuned SFX synths, then run the Synth(\menu*)
s to generate events)
(
Routine {
~rootNote = 60;
SynthDef(\menuMove, {
arg outBus;
var trig = Impulse.ar(0); // LFNoise0.kr(0.5, 1, 1.5));
var ping = BPF.ar(WhiteNoise.ar(Decay.ar(trig, 0.06) * 0.2), 5000, 0.6);
var freq = 4000 + WhiteNoise.ar(Decay.ar(trig, 0.1) * 300);
var ring = Formlet.ar(trig, freq, 0.01, 0.1);
var output = ping + ring * 0.8;
DetectSilence.ar(output, doneAction: Done.freeSelf);
Out.ar(outBus, output);
}).add;
SynthDef(\menuOK, {
arg outBus;
var trig = Impulse.ar(0);
var freq = (~rootNote + 12).midicps * Trig.ar(trig, 0.08).range(1, 3/4);
var tone = LFTri.ar(freq) * EnvGen.ar(Env.asr(0.05, 1, 0.5), Trig.ar(trig, 0.23), doneAction: Done.freeSelf) * 0.5;
Out.ar(outBus, tone);
}).add;
SynthDef(\menuCancel, {
arg outBus;
var trig = Impulse.ar(0);
var freq = (~rootNote).midicps * 11/12; // * Trig.ar(trig, 0.05).range(1.5.sqrt, 1) * Trig.ar(trig, 0.12).range(0.5.sqrt, 1);
var mod = SinOscFB.ar(freq, Decay.ar(trig, 0.3)) * EnvGen.ar(Env.perc(0.001, 0.4), trig);
var car = SinOsc.ar(freq / 2, mod * 6) * EnvGen.ar(Env.perc(0.01, 0.3), trig, doneAction: Done.freeSelf) * 0.3;
Out.ar(outBus, car);
}).add;
SynthDef(\menuErr, {
arg outBus;
var trig = Impulse.ar(0);
var freq = (~rootNote).midicps * Trig.ar(trig, 0.05).range(1.5.sqrt, 1) * Trig.ar(trig, 0.12).range(0.5.sqrt, 1);
var mod = SinOscFB.ar(freq - 7, Decay.ar(trig, 0.6) * 1.1);
var car = SinOsc.ar(freq / 2, mod * 7) * EnvGen.ar(Env.perc(0.01, 0.6), trig, doneAction: Done.freeSelf) * 0.3;
Out.ar(outBus, car);
}).add;
SynthDef(\sea, {
arg inBus;
var input = In.ar(inBus);
var times = SinOsc.kr([1.3, 0.39, 0.9], 0, [0.002, 0.0008, 0.003], [0.08, 0.18, 0.13]);
var fb = LocalIn.ar(3);
var delays;
var ap = 0.05;
var diff = AllpassN.ar(fb * -2.dbamp + input, 0.1, SampleDur.ir * 190, 0.05);
diff = AllpassN.ar(diff, 0.1, SampleDur.ir * 213, 0.05);
diff = AllpassN.ar(diff, 0.1, SampleDur.ir * 241, 0.05);
delays = DelayL.ar(LPF.ar(diff, 3000), 1, times);
LocalOut.ar(delays.rotate(-1));
Out.ar(0, Splay.ar(delays) * 0.4 + (input ! 2));
}).add;
s.sync;
~seaIn = Bus.audio;
~sea = Synth(\sea, [\inBus, ~seaIn]);
}.play;
)
Synth(\menuMove, [\outBus, ~seaIn]);
Synth(\menuOK, [\outBus, ~seaIn]);
Synth(\menuCancel, [\outBus, ~seaIn]);
Synth(\menuErr, [\outBus, ~seaIn]);
edit: diffusion! maybe there should be a longer delay line in the mix too, eventually… too-short delays evoke a small tub of jelly reef jigglers…
(recycling as a game mechanic really helped sell me on this)