{
   "author" : "badnumbersmusic",
   "name" : "Xiongnu bells",
   "ancestor_list" : [],
   "description" : "Makes a sort of melody out of detuned bell sounds.",
   "labels" : [
      "bell"
   ],
   "id" : "1-57k",
   "is_private" : null,
   "code" : "(\r\nw=1;h=0.5;q=0.25;e=0.125;t=0.33;u=0.34;\r\nc = TempoClock.default;\r\nm = (\r\n\tchord: 0,\r\n\tscale: Scale([0,3,6,8,11,14,16],17),\r\n\tscaleChord: {\r\n\t\t|self,voicing|\r\n\t\tvar notes = voicing + self.chord;\r\n\t\tScale(self.scale.degrees.wrapAt(notes).sort, self.scale.pitchesPerOctave, self.scale.tuning);\r\n\t}\r\n);\r\nb = if (b.isNil,(),b);\r\nf = if (f.isNil,(),f);\r\n)\r\n\r\nc.tempo = 1.5;\r\n\r\nb.otey = Bus.audio(s,2);\r\n\r\n(\r\nSynthDef(\\clang,\r\n\t{\r\n\t\t|freq=200,amp=0.1,gate=1,out=0,pan=0,boost=2,tapCarFreq=200,tapModFreq=200, tapPmIndex = 3, tapRatio = 0.5, releaseTime=0.6|\r\n\t\tvar audio, chimeEnv, chimeFreqEnv, tap, tapEnv;\r\n\t\tchimeEnv = EnvGen.kr(Env([0,1,0.8,0],[0.001,0.005,releaseTime],[0,-2,-2]), gate, amp, doneAction:2);\r\n\t\tchimeFreqEnv = EnvGen.kr(Env([1,1.3,1],[0.005,0.005],[2,-2]), gate);\r\n\t\taudio = (1..20).collect({\r\n\t\t\t|num|\r\n\t\t\tvar freqOffset, currentFreq, ampOffset, currentAmp;\r\n\t\t\tfreqOffset = ((num * freq) % (num + 1)).linlin(0,num,0.95,1.05);\r\n\t\t\tampOffset = ((num * freq) % (num + 2)).linlin(0,num+1,0.5,1) * TRand.kr(0.4,1.2,gate);\r\n\t\t\tcurrentFreq = num * freq * freqOffset * chimeFreqEnv;\r\n\t\t\tSinOsc.ar(currentFreq, 0, 0.1 * ampOffset);\r\n\t\t});\r\n\t\taudio = Mix(audio) * chimeEnv;\r\n\t\ttapEnv = EnvGen.kr(Env([0,1.1,0],[0.001,0.25],[0,-2]), gate, amp);\r\n\t\ttap = PMOsc.ar(freq.linlin(200,550,131.4,131.2) * tapCarFreq, tapModFreq, tapPmIndex, SinOsc.ar(130), tapEnv);\r\n\t\taudio = XFade2.ar(audio, tap, tapRatio);\r\n\t\taudio = (audio * boost).tanh / boost;\r\n\t\taudio = LPF.ar(audio, (freq * 10).min(10000));\r\n\t\taudio = Pan2.ar(audio,pan);\r\n\t\tOut.ar(out,audio);\r\n\t}\r\n).add;\r\nSynthDef(\\otey,\r\n\t{\r\n\t\t|in,out,gate=1|\r\n\t\tvar audio,env;\r\n\t\tenv = EnvGen.kr(Env.cutoff(5), gate, doneAction:2);\r\n\t\taudio = In.ar(in,2);\r\n\t\taudio = OteySoundBoard.ar(audio);\r\n\t\tOut.ar(out,audio);\r\n\t}\r\n).add;\r\n)\r\n\r\n(\r\nf.otey.free;\r\nf.otey = Synth(\\otey, [\\in, b.otey, \\out, 0]);\r\n)\r\n\r\n(\r\nPdef(\\clang,\r\n\tPbind(\r\n\t\t\\instrument, \\clang,\r\n\t\t\\octave, 4,\r\n\t\t\\scale,Pfunc({m.scaleChord([0,2,4,6])}),\r\n\t\t\\offset, Pstutter(Pwhite(5,20,inf),Pbrown(0,6,3,inf)),\r\n\t\t\\degree, Pstutter(Pwrand([1,Pwhite(2,20,1)],[100,1].normalizeSum,inf),Pseq([0,1,2],inf) + Pkey(\\offset)),\r\n\t\t//\\degree, Pseq([0,4],inf),\r\n\t\t[\\dur,\\ampScale,\\type, \\tapRatio], Pwrand([\r\n\t\t\tPseq([[q,0.1,\\note, 0.2],[q,0.07,\\note, 0.6]]),\r\n\t\t\tPseq([[t/2,0.1,\\note, 0.2],[t/2,0.05,\\note, 0.8],[u/2,0.07,\\note, 0.6]],Pwhite(1,3,1)),\r\n\t\t\tPseq([[q/4,0.1,\\note, 0.2],[q/4,0.1,\\rest, 0.4],[q/4,0.03,\\note, 0.7],[q/4,0.04,\\note, 0.6]])\r\n\t\t],[10,1,3].normalizeSum,inf),\r\n\t\t\\amp, Pkey(\\ampScale) * 6 * Pgauss(1, 0.2,inf),\r\n\t\t\\out,b.otey,\r\n\t\t\\timingOffset, Pkey(\\dur) * Pbrown(-0.1,0.1,0.04,inf),\r\n\t\t\\tapCarFreq, 114,\r\n\t\t\\tapModFreq, Pwhite(754,759,inf),\r\n\t\t\\tapPmIndex, 1.9,\r\n\t\t\\pan, Pkey(\\degree).linlin(0,8,-0.8,0.5) + Pgauss(0,0.1,inf),\r\n\t\t\\releaseTime, Pkey(\\degree).linlin(0,8,0.8,0.6)\r\n\t)\r\n).play;\r\n)\r\nPdef(\\clang).stop;"
}
