Skip to content

Instantly share code, notes, and snippets.

@lgvr123
Created February 22, 2022 15:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save lgvr123/80b6b73d1fb7c0cb396eec8e033532e9 to your computer and use it in GitHub Desktop.
Save lgvr123/80b6b73d1fb7c0cb396eec8e033532e9 to your computer and use it in GitHub Desktop.
(
// Redéfinir freqToScale pour (1) corriger les bugs, (2) retourner une valeur non entière si le degré ne correspond pas.
~freqToScale={ arg self, freq;
// conversion from frequency to scale value.
self.use {
var steps = ~scale.respondsTo(\stepsPerOctave).if(
{ ~scale.stepsPerOctave }, ~stepsPerOctave
);
self.freqToNote(freq).round(0.01).keyToDegree(~scale, steps)- ~mtranspose;
}
};
~bb7=(gt:-2, scale:Scale.mixolydian);
~eb7=(gt:3, scale:Scale.mixolydian);
~cm7=(gt:0, scale:Scale.minor);
~f7=(gt:5, scale:Scale.mixolydian);
~bbpmaj=(gt:-2, scale:Scale.majorPentatonic);
~bbpmin=(gt:-2, scale:Scale.minorPentatonic);
~sg=[~bb7,~eb7,~bb7,~bb7,~eb7,~eb7,~bb7,~bb7,~cm7,~f7,~bb7,~f7];
~pg=[~bbpmaj,~bbpmin,~bbpmaj,~bbpmaj,~bbpmin,~bbpmin,~bbpmaj,~bbpmaj,~bbpmaj,~bbpmaj,~bbpmaj,~bbpmaj];
~g=~sg;
)
(
~chords=Pbind(
\dur,Pn(4,~sg.size),
#[\gtranspose, \scale], Prout({~sg.do({|s| [s.gt,s.scale].yield})}),
\degree,[0,2,4,6],
\amp,0.1,
);
~pE=nil;
~solo=Pbind(
\dur, Pn(Pconst(4,Pn(Pwhite(0.0,1).lincurve(0,1,0.125,2,4),inf), tolerance: 0.5),~sg.size,\bar),
\measure, Pgate(Prout({inf.do({|s| s.yield})}),1,\bar),
\gtranspose, Pfunc({|evt| ~sg[evt['measure']]['gt']}),
\scale, Pfunc({|evt| ~sg[evt['measure']]['scale']}),
\detuneProb, 0.4,
\amp, 0.4,
\degree, Pfunc({|current|
var pd, d;
#pd,d=((~pE?(\degree: Rest()))[\degree].isRest).if({
// # d,n=~pE.isNil.if({
// 1er évènement, où l'évèbement précédent était un Silence
// ==> On force la gamme pentatonique et on choisit un degré dedans
var scale, gt, d, n;
scale=~pg[current['measure']]['scale'];
gt=~pg[current['measure']]['gt'];
current['scale']=scale;
current['gtranspose']=gt;
d=scale.degrees.choose ; //+ [-1,0,1].choose*scale.degrees.size;
pd="Rest";
["rest",d];
},{
var d,pd;
var step;
var out;
var pF=~pE[\freq].value;
// n=current[\freqToNote].value(current,pF);
pd=~freqToScale.value(current,pF);
step=0.gauss(1);
// step=[0,-1,1,0.gauss(2)].choose;
if(((pd+step)<(-5)).and({step<0}),{
d=pd-step;
},{
if(((pd+step)>10).and({step>0}),{
d=pd-step;
},{
d=pd+step;
})
});
// [pd,step.round(0.01),d.round(0.01)].postln;
d=d.round;
// d.postln;
[pd,d];
});
current['dur'].lincurve(0,2,current.detuneProb,current.detuneProb/2,1).coin.if({d=d+[-1,1].choose*0.5});
postf("was %, is now %\n",pd,d);
// Plus la durée est longue, plus je veux que la probalité d'un silence soit grande
current['dur'].lincurve(0,2,1,0.1,1).coin.if({d},{Rest()});
}),
\callback, {|evt| ~pE=evt;
~pE[\note]=~pE.use(~pE[\note]); ~pE[\midinote]=~pE.use(~pE[\midinote]);
}.inEnvir,
);
Ppar([~chords,~solo]).play;
)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment