Skip to main content

  | मौसम…

411 समाचार
Public archive edition · Attributed source reporting with original dates · AI drafts are excluded

411 REFERENCE · Wikibooks

Designing Sound in SuperCollider/Telephone bell

Reference material by Wikibooks contributors. This retains its source identity and is not 411 news reporting.

29 Old-style telephone bell In the book, one partial of the resonance is modelled using a sinewave, modulated by an envelope that dies away on a quadratic-shaped curve. Groups of three such oscillators are then made. Here we take advantage of a built-in unit in SuperCollider which does quite a lot of the work for us: Klank. A difference: it gives exponential rather than quadratic decay - which is not too bad since exponential decay is often what you want. Fig 29.11: a simple metallic resonance with three pitches ( { var son; son = Klank.ar(`[ [521, 732, 934], // freqs [0.7, 0.45, 0.25],// amps [0.8, 0.8, 0.8] // ring times ], Impulse.ar(1)); Pan2.ar(son * 0.2) }.play ) Fig 29.12: a striker sound As described in the book, a brief click is all we need to approximate this part of the sound. ( x = { var son = WhiteNoise.ar(XLine.ar(1, 0.000001, 0.01, doneAction: 2)) * 0.1; Pan2.ar(son) }.play ) Fig 29.13: many resonators to create the various modes of the bell ( SynthDef(\dsaf_phonebell1, { |freq=465, strength=1, decay=3| var son; son = Klank.ar(`[ // frequency ratios [0.501, 1, 0.7, 2.002, 3, 9.6, 2.49, 11, 2.571, 3.05, 6.242, 12.49, 13, 16, 24], // amps [0.002,0.02,0.001, 0.008,0.02,0.004, 0.02,0.04,0.02, 0.005,0.05,0.05, 0.02, 0.03, 0.04], // ring times - "stutter" duplicates each entry threefold [1.2, 0.9, 0.25, 0.14, 0.07].stutter(3) ] , Impulse.ar(1), freq, 0, decay); Out.ar(0, Pan2.ar(son)); }).add ) x = Synth(\dsaf_phonebell1, [\freq, 500]); Note: leave the bell playing while you add the following effect: Fig 29.14: resonant effects of bakelite phone casing ( SynthDef(\dsaf_phonecase1, { |in=0, out=0, mix=0| var casein = In.ar(in, 2); var delayA = CombC.ar(casein, 0.00077, 0.00077, 0.1); var delayB = CombC.ar(delayA, 0.00088, 0.00088, 0.1); var bands = BPF.ar(delayB, [1243, 287, 431], 1/12).sum; var son = bands.clip2(0.3); ReplaceOut.ar(out, XFade2.ar(casein, son, mix)) }).add ) y = Synth(\dsaf_phonecase1, target: x, addAction: \addAfter); If you have sc3.3 or later, you can visualise a frequency representation of the filter's effect: GUI.stethoscope.defaultServer.boot; ( // Notice that for this shortcut visualisation, we define the filter as a function taking its // input as an argument, and returning its output (we don't use In.ar or Out.ar) { |casein| var delayA = CombC.ar(casein, 0.00077, 0.00077, 0.1); var delayB = CombC.ar(delayA, 0.00088, 0.00088, 0.1); var bands = BPF.ar(delayB, [1243, 287, 431], 1/12).sum; var son = bands.clip2(0.3); // Mouse to the LEFT means flat filter (no change), to the RIGHT means full bakelite XFade2.ar(casein, son, MouseX.kr(-1,1)); }.scopeResponse ) Fig 29.14: putting it all together We will re-use the SynthDef from fig 29.14, so make sure you have run that so that the server has that SynthDef. (But stop the sound, if it is still running.) // A tweaked version of the phonebell synthdef, to take an on/off from outside, and incorporate the striker ( SynthDef(\dsaf_phonebell2, { |gate=1, freq=465, strength=1, decay=3, amp=1| var trigs, striker, son; trigs = Impulse.ar(14) * gate; striker = WhiteNoise.ar(EnvGen.ar(Env.perc(0.0000001, 0.01), trigs)); son = Klank.ar(`[ // frequency ratios [0.501, 1, 0.7, 2.002, 3, 9.6, 2.49, 11, 2.571, 3.05, 6.242, 12.49, 13, 16, 24], // amps [0.002,0.02,0.001, 0.008,0.02,0.004, 0.02,0.04,0.02, 0.005,0.05,0.05, 0.02, 0.03, 0.04], // ring times - "stutter" duplicates each entry threefold [1.2, 0.9, 0.25, 0.14, 0.07].stutter(3) ] , striker, freq, 0, decay); Out.ar(0, Pan2.ar(son * amp)); }).add ) // We could launch the patch all at once, but let's do it bit-by-bit so we understand what's going on // Here we start the phone bells constantly ringing. We put them in a group for convenience ~bellgroup = Group.new(s); ~bell1 = Synth(\dsaf_phonebell2, [\freq, 650], ~bellgroup); ~bell2 = Synth(\dsaf_phonebell2, [\freq, 653], ~bellgroup); // Now we add the bakelite y = Synth(\dsaf_phonecase1, [\mix, -0.65], target: ~bellgroup, addAction: \addAfter); // OK, shush for now ~bellgroup.set(\gate, 0); // Now let's turn them on and off in a telephone-like pattern. // This could be done using a synth, but let's use a (client-side) pattern: p = Pbind(\type, \set, \id, ~bellgroup.nodeID, \args, [\gate], \gate, Pseq([1,0], inf), \dur, 2).play p.stop