getting the gui working and major bug fix to accomp

This commit is contained in:
mwinter 2020-12-31 17:41:36 +01:00
parent 9d14e6c5b4
commit a76a653c99
11 changed files with 2532 additions and 1599 deletions

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

File diff suppressed because it is too large Load diff

Binary file not shown.

View file

@ -54,31 +54,19 @@ buildMetronome = {arg win;
metronome metronome
); );
OSCFunc({ arg msg, time;
{
var measure, beat;
measure = msg[3].postln;
beat = msg[4];
updateTransport.value(clock, metronome, measure, beat)
}.inEnvir.defer;
},'/measureClock_' ++ ~hash, s.addr);
[clock, metronome, layout] [clock, metronome, layout]
}; };
buildTransport = {arg win, view, metronome; buildTransport = {arg win, view, metronome;
var sectionDisplay, updateSection, countOff; var layout, sectionDisplay, updateSection, countOff;
HLayout( layout = HLayout(
Button(view).states_([["<<", Color.black]]).action_({arg pState; updateSection.value(-4)}.inEnvir), Button(view).states_([["<<", Color.black]]).action_({arg pState; updateSection.value(-4)}.inEnvir),
Button(view).states_([["<", Color.black]]).action_({arg pState; updateSection.value(-1)}.inEnvir), Button(view).states_([["<", Color.black]]).action_({arg pState; updateSection.value(-1)}.inEnvir),
Button(view).states_([["play", Color.black], ["stop", Color.black, Color.grey]]).action_({arg pState; Button(view).states_([["play", Color.black], ["stop", Color.black, Color.grey]]).action_({arg pState;
if(pState.value == 1, { if(pState.value == 1, {
{~patternProxy.source = Pseq(~patterns); {
Pbind( ~patternProxy.source = Pseq(~patterns);
\instrument, \click_ ++ ~hash, Pbind(\instrument, \click_ ++ ~hash, \beat, Pseq([1, 2, 1, 2]), \dur, 1).play(~tempoClock, quant: 0);
\beat, Pseq([1, 2, 1, 2]),
\dur, 1
).play(~tempoClock, quant: 0);
[1, 2, 1, 2].do({arg beat; [1, 2, 1, 2].do({arg beat;
{ {
metronome.stringColor = metronomeColorFunc.value(beat); metronome.stringColor = metronomeColorFunc.value(beat);
@ -96,7 +84,8 @@ buildTransport = {arg win, view, metronome;
}.inEnvir), }.inEnvir),
Button(view).states_([[">", Color.black]]).action_({arg pState; updateSection.value(1)}.inEnvir), Button(view).states_([[">", Color.black]]).action_({arg pState; updateSection.value(1)}.inEnvir),
Button(view).states_([[">>", Color.black]]).action_({arg pState; updateSection.value(4)}.inEnvir), nil, Button(view).states_([[">>", Color.black]]).action_({arg pState; updateSection.value(4)}.inEnvir), nil,
sectionDisplay = StaticText(win).string_("section: 1.1").font_(Font("Liberation Mono", 70)), nil) sectionDisplay = StaticText(win).string_("section: 1.1").font_(Font("Liberation Mono", 70)), nil);
[sectionDisplay, layout]
}; };
@ -169,15 +158,23 @@ buildTrackFader = {arg view, name, index, initVal;
masterView = {arg win; masterView = {arg win;
var updateTransport, updateSection, var view, generatorLayout, clock, metronome, metronomeLayout, transportLayout, auxControlsLayout, countOff, ranSeed, order, tempo, sectionDisplay, address;
view, generatorLayout, clock, metronome, metronomeLayout, transportLayout, auxControlsLayout, countOff, ranSeed, order, tempo, sectionDisplay, address;
view = View(win); view = View(win);
generatorLayout = buildGenerator.value(view); generatorLayout = buildGenerator.value(view);
# clock, metronome, metronomeLayout = buildMetronome.value(win); # clock, metronome, metronomeLayout = buildMetronome.value(win);
transportLayout = buildTransport.value(win, view, metronome); # sectionDisplay, transportLayout = buildTransport.value(win, view, metronome);
auxControlsLayout = buildAuxControls.value(view); auxControlsLayout = buildAuxControls.value(view);
OSCFunc({ arg msg, time;
{
var measure, beat, section, subsection;
# measure, beat, section, subsection = msg[3..];
updateTransport.value(clock, metronome, measure, beat);
sectionDisplay.string = "section: " ++ section.asInteger ++ "." ++ subsection.asInteger;
}.inEnvir.defer;
},'/measureClock_' ++ ~hash, s.addr);
view.layout_( view.layout_(
HLayout( HLayout(
[ [

View file

@ -22,7 +22,7 @@ s.waitForBoot({
~musicData = ~genMusicData.value(seed); ~musicData = ~genMusicData.value(seed);
~scoreData = ~genScoreData.value(~musicData[0]); ~scoreData = ~genScoreData.value(~musicData[0]);
~sectionData = ~musicData[2]; ~sectionData = ~musicData[2];
~patterns = ~genPatterns.value(~musicData[0], ~musicData[1]); ~patterns = ~genPatterns.value(~musicData[0], ~musicData[1], ~sectionData);
}; };
~patternProxy = EventPatternProxy.new; ~patternProxy = EventPatternProxy.new;
@ -41,6 +41,7 @@ s.waitForBoot({
~genAll = {arg seed; ~genAll = {arg seed;
~allMusicData = ~genMusicData.value(seed); ~allMusicData = ~genMusicData.value(seed);
~patterns = ~allMusicData[0]; ~patterns = ~allMusicData[0];
~scoreData = ~allMusicData[1]; ~scoreData = ~allMusicData[1];
~sectionOffsets = ~allMusicData[2]; ~sectionOffsets = ~allMusicData[2];
~currentSection = 0; ~currentSection = 0;

View file

@ -350,17 +350,19 @@ genEnsemblePart = {arg partState, modeState, temporalData, roots, part, offset;
//~~~~~~~~~~~~GENERATE ELECTRONIC ACCOMPANIMENT~~~~~~~~~~~~ //~~~~~~~~~~~~GENERATE ELECTRONIC ACCOMPANIMENT~~~~~~~~~~~~
genAccompPart = {arg modeState, temporalData, offset, trans, part; genAccompPart = {arg modeState, temporalData, offset, trans, part;
var accompData; var firstChange, accompData;
firstChange = false;
accompData = []; accompData = [];
temporalData.do({arg val, tS; temporalData.do({arg val, tS;
var change; var change;
change = [val == 1, tS == 0].wchoose([1, if(part == 0, {5}, {2})].normalizeSum); //5 * abs((curPulse / totalLen).clip(0, 0.8) - 1)].normalizeSum); change = [val == 1, (val == 1) && firstChange.not].wchoose([1, if(part == 0, {5}, {2})].normalizeSum); //5 * abs((curPulse / totalLen).clip(0, 0.8) - 1)].normalizeSum);
if(change, { if(change, {
var sel, freq, amp; var sel, freq, amp;
sel = wchooseDict.value(modeState, 0.1); sel = wchooseDict.value(modeState, 0.1);
freq = 48.midicps * trans * frToFloat.value(sel); freq = 48.midicps * trans * frToFloat.value(sel);
amp = [0, 1, 2, 3].wchoose([5, 2, 1, 1].normalizeSum); amp = [0, 1, 2, 3].wchoose([5, 2, 1, 1].normalizeSum);
accompData = accompData.add([freq, tS + offset, amp, part]); accompData = accompData.add([freq, tS + offset, amp, part]);
firstChange = true;
}); });
}); });
accompData accompData
@ -372,7 +374,7 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
var totalDur, dUnit, totalLen, curLen, var totalDur, dUnit, totalLen, curLen,
modeState, temporalState, partStates, lastCadenceState, modeState, temporalState, partStates, lastCadenceState,
ensData, accompData, sectionData, ensData, accompData, sectionData,
roots, lastRoots, sectionCount; roots, lastRoots, sectionCount, subsectionCount;
thisThread.randSeed = seed; thisThread.randSeed = seed;
@ -391,6 +393,7 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
sectionData = Dictionary.with(*[0->4]); sectionData = Dictionary.with(*[0->4]);
sectionCount = 0; sectionCount = 0;
subsectionCount = 0;
while({curLen < totalLen}, { while({curLen < totalLen}, {
var temporalData; var temporalData;
# temporalData, temporalState = genTemporalData.value(temporalState, modeState, curLen == 0); # temporalData, temporalState = genTemporalData.value(temporalState, modeState, curLen == 0);
@ -403,11 +406,10 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
roots = distributeRoots.value(modeState, lastRoots); roots = distributeRoots.value(modeState, lastRoots);
sectionData.add((curLen / 4).asInteger->[roots, lastRoots.collect({arg fr, part; sectionData.add((curLen / 4).asInteger->[roots, lastRoots.collect({arg fr, part;
[fr, 36.midicps * pow(2, [1, 0, 1, 2][part]) * frToFloat.value(fr)]})]); [fr, 36.midicps * pow(2, [1, 0, 1, 2][part]) * frToFloat.value(fr)]}), sectionCount, subsectionCount]);
4.do({arg part; 4.do({arg part;
var musicData, partState, noteCountInd; var musicData, partState, noteCountInd;
//thisThread.randSeed = (seed + sectionCount + 1 + part).postln;
# musicData, partState = genEnsemblePart.value(partStates[part], modeState, temporalData[part], roots, part, curLen); # musicData, partState = genEnsemblePart.value(partStates[part], modeState, temporalData[part], roots, part, curLen);
ensData[part] = ensData[part] ++ musicData; ensData[part] = ensData[part] ++ musicData;
partStates[part] = partState; partStates[part] = partState;
@ -419,117 +421,19 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
}); });
}); });
sectionCount = sectionCount + 1; subsectionCount = subsectionCount + 1;
thisThread.randSeed = (seed + sectionCount); thisThread.randSeed = (seed + (sectionCount * 100) + subsectionCount);
modeState = advanceMode.value(modeState, lastCadenceState); modeState = advanceMode.value(modeState, lastCadenceState);
if(collectRoots.value(modeState).size == 1, {lastCadenceState = modeState}); if(collectRoots.value(modeState).size == 1, {
sectionCount = sectionCount + 1;
subsectionCount = 0;
lastCadenceState = modeState;
});
curLen = curLen + temporalData[0].size; curLen = curLen + temporalData[0].size;
}); });
//format
/*
ensData = ensData.collect({arg partData;
partData.flop.collect({arg data, d; if(d == 1, {data.differentiate ++ [10]}, {[0] ++ data})})
});
*/
//format
/*
ensData = ensData.collect({arg partData;
var res;
res = partData.flop;
res = res.add(res[1]);
res[1] = (res[1].differentiate.drop(1) ++ [10]).postln;
res = res.flop ++ (res.last.last.ceil(16) / 16).asInteger.collect({arg measure; [0, 0, 0, 0, 0, measure * 16]});
res = res.postln.sort({arg a, b; a.last < b.last}).postln;
res = res.flop.postln;
//res.last.postln;
res = res.insert(1, (res.last.postln.differentiate.drop(1) ++ [10])).flop.postln;
});
accompData = accompData.collect({arg voice;
voice.collect({arg partData;
partData.flop.collect({arg data, d; if(d == 1, {data.differentiate ++ [10]}, {[0] ++ data})})
});
});
*/
[ensData, accompData, sectionData] [ensData, accompData, sectionData]
}; };
//~~~~~~~~~~~~DEFINE SYNTHS~~~~~~~~~~~~
/*
SynthDef(\ens, {arg freq = 440, amp = 1, dur = 1, gate = 1;
Out.ar([0, 1], SinOsc.ar(freq, 2pi.rand, amp * 0.01) * EnvGen.kr(Env.asr(0.1, 1, 0.1), gate, doneAction: 2))
}).add;
SynthDef(\accomp, {arg freq = 440, amp = 1, attack = 1, dur = 1, gate = 1, bout = 0;
Out.ar(bout, SinOsc.ar(freq, 2pi.rand, 1) * 0.01 * amp * EnvGen.kr(Env.asr(attack, 1, 0.01), gate, doneAction: 2))
}).add;
SynthDef(\clip, {arg dur = 1, gate = 1, bin = 0;
//Out.ar([0, 1], (In.ar(bin)).clip(0, 1) * pow(Line.kr(0, 1, 240), 2))
Out.ar([0, 1], (In.ar(bin)).clip(0, 1) * pow(Line.kr(0, 1, 10), 2))
}).add;
//~~~~~~~~~~~~GENERATE PATTERNS~~~~~~~~~~~~
genPatterns = {arg ensData, accompData, dUnit;
Ppar(
ensData.collect({arg musData, m;
Pbind(
\instrument, \ens,
\freq, Pseq(musData[0]),
//\freq, Pseq(musData[0].collect({arg freq; freq.cpsmidi.round(0.5).midicps})),
\dur, Pseq(musData[1] * dUnit),
\sustain, Pseq(musData[1] * dUnit),
\amp, [0.5, 0.3, 0.3, 0.3][m] //Pseq(musData[2].collect({arg item; [0, 0.25, 0.5, 0.75][item]}) * [1, 0.5, 0.25, 0.1][m] * 16);// * musData[3].collect({arg val; if(val < 0.25, {0}, {0.5})}))
) )
}) ++
accompData.collect({arg voice, v;
voice.collect({arg musData;
Pbind(
\instrument, \accomp,
\freq, Pseq(musData[0]),
//\freq, Pseq(musData[0].collect({arg freq; freq.cpsmidi.round(0.5).midicps})),
\dur, Pseq(musData[1] * dUnit),
\sustain, Pseq(musData[1] * dUnit),
\amp, Pseq(musData[2].collect({arg item; [0, 2, 4, 8][item]}) * 0.0125 * 1),
//\attack, Pseq(musData[1] * abs(musData[3].clip(0, 0.25) * 2 - 1) * dUnit),
\attack, Pseq(musData[1] * 0.9 * dUnit),
\bout, v + 5
)
}).add(
Pmono(
\clip,
\bin, v + 5
)
)
}).flatten
);
};
*/
//~~~~~~~~~~~~MAIN / RUN~~~~~~~~~~~~
/*
~dUnit = 8.reciprocal;
~musicData = genMusicData.value(~dUnit);
~scoreData = genScoreData.value(~musicData[0]);
~sectionData = ~musicData[2];
~sectionData.postln;
~patterns = genPatterns.value(~musicData[0], ~musicData[1], ~dUnit);
//~patterns.play;
*/
//~musicData = ~genMusicData.value(100);
)
//~musicData = ~genMusicData.value(100);

View file

@ -27,8 +27,8 @@ SynthDef(\masterPlayerControl_ ++ ~hash, {
}).add; }).add;
SynthDef(\transport_ ++ ~hash, {arg measure = 0, beat = 0, gate = 1, dur = 1; SynthDef(\transport_ ++ ~hash, {arg measure = 0, beat = 0, section = 0, subsection = 0, gate = 1, dur = 1;
SendReply.kr(Impulse.kr(0) * (measure > 0) * (beat > 0),'/measureClock_' ++ ~hash, values: [measure.poll, beat]); SendReply.kr(Impulse.kr(0) * (measure > 0) * (beat > 0),'/measureClock_' ++ ~hash, values: [measure, beat, section, subsection]);
SendReply.kr(Impulse.kr(0) * (measure < 1) * (beat < 1),'/nextSubsection_' ++ ~hash); SendReply.kr(Impulse.kr(0) * (measure < 1) * (beat < 1),'/nextSubsection_' ++ ~hash);
EnvGen.kr(Env.sine(dur), gate, doneAction: 2); EnvGen.kr(Env.sine(dur), gate, doneAction: 2);
}).add; }).add;
@ -74,8 +74,8 @@ formatPatternData = {arg musData, measureLen;
//~~~~~~~~~~~~GENERATE PATTERNS~~~~~~~~~~~~ //~~~~~~~~~~~~GENERATE PATTERNS~~~~~~~~~~~~
~genPatterns = {arg ensData, accompData; ~genPatterns = {arg ensData, accompData, sectionData;
var measureLen, ensDataFormatted, accompDataFormatted, dUnit, pattern; var measureLen, ensDataFormatted, accompDataFormatted, dUnit, section, subsection;
measureLen = (( measureLen = ((
ensData.collect({arg partData; partData.last[1]}) ++ ensData.collect({arg partData; partData.last[1]}) ++
@ -87,6 +87,10 @@ formatPatternData = {arg musData, measureLen;
dUnit = 8.reciprocal; dUnit = 8.reciprocal;
measureLen.collect({arg measure; measureLen.collect({arg measure;
if(sectionData[measure * 4] != nil, {
section = sectionData[measure * 4][2];
subsection = sectionData[measure * 4][3];
});
Ppar( Ppar(
ensDataFormatted[measure].collect({arg musData, m; ensDataFormatted[measure].collect({arg musData, m;
Pbind( Pbind(
@ -101,6 +105,7 @@ formatPatternData = {arg musData, measureLen;
) )
}) ++ }) ++
accompDataFormatted[measure].collect({arg musData, m; accompDataFormatted[measure].collect({arg musData, m;
//"--------".postln;
Pbind( Pbind(
\instrument, \accomp_ ++ ~hash, \instrument, \accomp_ ++ ~hash,
\freq, Pseq(musData[0].replace(0, Rest(0))), \freq, Pseq(musData[0].replace(0, Rest(0))),
@ -109,7 +114,7 @@ formatPatternData = {arg musData, measureLen;
\amp, Pseq(musData[3].collect({arg item; [0, 2, 4, 8][item]}) * 0.0125 * 1), \amp, Pseq(musData[3].collect({arg item; [0, 2, 4, 8][item]}) * 0.0125 * 1),
//\attack, Pseq(musData[1] * abs(musData[3].clip(0, 0.25) * 2 - 1) * dUnit), //\attack, Pseq(musData[1] * abs(musData[3].clip(0, 0.25) * 2 - 1) * dUnit),
\attack, Pseq(musData[2] * 0.9 * dUnit), \attack, Pseq(musData[2] * 0.9 * dUnit),
\bout, musData[4] + 6 \bout, Pseq(musData[4] + 6)
) )
}) ++ }) ++
[ [
@ -117,6 +122,8 @@ formatPatternData = {arg musData, measureLen;
\instrument, \transport_ ++ ~hash, \instrument, \transport_ ++ ~hash,
\measure, measure + 1, \measure, measure + 1,
\beat, Pseq([1, 2]), \beat, Pseq([1, 2]),
\section, section,
\subsection, subsection,
\dur, 8 * dUnit \dur, 8 * dUnit
), ),
Pbind( Pbind(

View file

@ -308,7 +308,7 @@ consolidateNotes = {arg lyStr, part;
var res; var res;
res = ensData.collect({arg partData; res = ensData.collect({arg partData;
partData.flop.collect({arg data, d; if(d == 1, {data.differentiate ++ [10]}, {[0] ++ data})}) partData.flop.collect({arg data, d; if(d == 1, {data.differentiate ++ [10]}, {[0] ++ data})})
}).postln; });
res.collect({arg part; part.flop}) res.collect({arg part; part.flop})
}; };
) )