adding bass part

This commit is contained in:
mwinter 2021-01-02 23:57:52 +01:00
parent c8fff752fb
commit c25347be55
10 changed files with 4377 additions and 2017 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

@ -236,8 +236,8 @@ masterView = {arg win;
faderView = {arg win; faderView = {arg win;
var view, masterIndicators, trackIndicators, master, tracks; var view, masterIndicators, trackIndicators, master, tracks;
var partAbbr = ["*", "III", "II", "I", "accomp", "click"]; var partAbbr = ["*", "III", "II", "I", "accomp_I", "accomp_II", "click"];
var trackNames = ["*", "III", "II", "I", "accomp", "click"]; var trackNames = ["*", "III", "II", "I", "accomp_I", "accomp_II", "click"];
var partVols, partMutes, partPans; var partVols, partMutes, partPans;
var masterMute, masterVol; var masterMute, masterVol;
@ -264,7 +264,7 @@ faderView = {arg win;
master = buildMasterFader.value(view, masterVol, masterMute, masterIndicators); master = buildMasterFader.value(view, masterVol, masterMute, masterIndicators);
tracks = {arg part; tracks = {arg part;
buildTrackFader.value(view, trackNames[part], part, 0); buildTrackFader.value(view, trackNames[part], part, 0);
} ! 6; } ! 7;
view.layout_(HLayout(master, nil, *tracks)) view.layout_(HLayout(master, nil, *tracks))
}; };

View file

@ -22,8 +22,8 @@ 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];
~sectionNavDict = ~musicData[3].postln; ~patterns = ~genPatterns.value(~musicData[0], ~musicData[1], ~musicData[3], ~sectionData);
~patterns = ~genPatterns.value(~musicData[0], ~musicData[1], ~sectionData); ~sectionNavDict = ~musicData[4].postln;
~isPlaying = false; ~isPlaying = false;
}; };
@ -34,7 +34,7 @@ s.waitForBoot({
"loading app".postln; "loading app".postln;
~genAll.value(19800725); ~genAll.value(19800725);
~play = Synth.new(\masterPlayerControl_ ++ ~hash); ~play = Synth.new(\masterPlayerControl_ ++ ~hash);
4.collect({arg p; Synth.new(\clip_ ++ ~hash, [\bin, p + 6, \bus, ~busses[4].index])}); 4.collect({arg p; Synth.new(\clip_ ++ ~hash, [\bin, p + 6, \bus, ~busses[5].index])});
~generateGUI.value; ~generateGUI.value;
"ready".postln; "ready".postln;

View file

@ -4,7 +4,7 @@ genMode, hdChoose, wchooseDict, collectRoots,
initModeState, advanceMode, initModeState, advanceMode,
initTemporalState, genTemporalData, initTemporalState, genTemporalData,
initPartStates, distributeRoots, initPartStates, distributeRoots,
genEnsemblePart, genAccompPart, genMusicData, genScoreData, genPatterns; genEnsemblePart, genAccompPart, genBassPart, genMusicData, genScoreData, genPatterns;
//~~~~~~~~~~~~FREQUENCY RATIO MATH FUNCTIONS~~~~~~~~~~~~ //~~~~~~~~~~~~FREQUENCY RATIO MATH FUNCTIONS~~~~~~~~~~~~
@ -208,8 +208,9 @@ genTemporalData = {arg lastTupleState, modeState, cadenceOverride, noParts = 4;
flourish = (if(cadence, {16}, {8}) + 32.rand).collect({[0, 1].wchoose([flourishDensity, 1].normalizeSum)}); flourish = (if(cadence, {16}, {8}) + 32.rand).collect({[0, 1].wchoose([flourishDensity, 1].normalizeSum)});
buffer = 16.collect({0}); buffer = 16.collect({0});
beforeLen = if(cadence, {32.rand}, {((timeToNextEvent - flourish.size - buffer.size) / 2).asInteger.rand}); //beforeLen = if(cadence, {32.rand}, {((timeToNextEvent - flourish.size - buffer.size) / 2).asInteger.rand});
before = beforeLen.collect({arg i; [0, 1].wchoose([genDensity, 1].normalizeSum)}); beforeLen =((timeToNextEvent - flourish.size - buffer.size) / if(cadence, {1.25}, {1})).asInteger.rand;
before = beforeLen.collect({arg i; [0, 1].wchoose([genDensity, 0.25].normalizeSum)});
//if(collectRoots.value(modeState).size == 1, {before = [0]}); //if(collectRoots.value(modeState).size == 1, {before = [0]});
after = (timeToNextEvent - before.size - flourish.size - buffer.size).collect({[0, 1].wchoose([genDensity, 1].normalizeSum)}); after = (timeToNextEvent - before.size - flourish.size - buffer.size).collect({[0, 1].wchoose([genDensity, 1].normalizeSum)});
flourish = before ++ flourish ++ after; flourish = before ++ flourish ++ after;
@ -349,18 +350,26 @@ 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, register;
var firstChange, accompData; var firstChange, accompData;
firstChange = false; firstChange = false;
accompData = []; accompData = [];
temporalData.do({arg val, tS; temporalData.do({arg val, tS;
var change; var change;
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); change = [val == 1, (val == 1) && firstChange.not].wchoose([1, if(part == 0, {5}, {3})].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([2, 2, 1, 1].normalizeSum);
/*
if(register == 0, {
amp = 3;
freq = 24.midicps * trans * frToFloat.value(sel);
});
*/
accompData = accompData.add([freq, tS + offset, amp, part]); accompData = accompData.add([freq, tS + offset, amp, part]);
firstChange = true; firstChange = true;
}); });
@ -368,17 +377,27 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
accompData accompData
}; };
//~~~~~~~~~~~~GENERATE ELECTRONIC BASS~~~~~~~~~~~~
genBassPart = {arg root, offset1, offset2;
var bassData;
[
[24.midicps * frToFloat.value(frCollapse.value(frAdd.value(root, [[3], [2]]))), offset1, (offset2 + 32) - (offset1), 10, 5, 1],
//[24.midicps * frToFloat.value(root) * 3/2, offset2 + 16, 1],
[24.midicps * frToFloat.value(root), offset2 + 32, 5, 10, 30, 1]]
};
//~~~~~~~~~~~~GENERATE ALL MUSIC DATA~~~~~~~~~~~~ //~~~~~~~~~~~~GENERATE ALL MUSIC DATA~~~~~~~~~~~~
~genMusicData = {arg seed; ~genMusicData = {arg seed;
var totalDur, dUnit, totalLen, curLen, var totalDur, dUnit, totalLen, curLen,
modeState, temporalState, partStates, lastCadenceState, modeState, temporalState, partStates, lastCadenceState, lastCadencePoint,
ensData, accompData, sectionData, ensData, accompData, bassData, sectionData,
roots, lastRoots, sectionCount, subsectionCount, sectionNavDict; roots, lastRoots, sectionCount, subsectionCount, sectionNavDict;
thisThread.randSeed = seed; thisThread.randSeed = seed;
totalDur = 3 * 60; totalDur = 6 * 60;
dUnit = 8.reciprocal; dUnit = 8.reciprocal;
totalLen = (totalDur / dUnit).round(16); totalLen = (totalDur / dUnit).round(16);
curLen = 0; curLen = 0;
@ -387,8 +406,10 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
temporalState = initTemporalState.value; temporalState = initTemporalState.value;
partStates = initPartStates.value; partStates = initPartStates.value;
lastCadenceState = modeState.deepCopy; lastCadenceState = modeState.deepCopy;
lastCadencePoint = 0;
ensData = 4.collect({[]}); ensData = 4.collect({[]});
bassData = 3.collect({[]});
accompData = 4.collect({6.collect({[]})}); accompData = 4.collect({6.collect({[]})});
sectionData = Dictionary.new; //Dictionary.with(*[0->4]); sectionData = Dictionary.new; //Dictionary.with(*[0->4]);
sectionNavDict = Dictionary.new; //Dictionary.with(*[[[1], [1]]->1]); sectionNavDict = Dictionary.new; //Dictionary.with(*[[[1], [1]]->1]);
@ -405,6 +426,7 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
lastRoots = if(curLen == 0, {4.collect({[[1], [1]]})}, {roots.slice(nil, 0)}); lastRoots = if(curLen == 0, {4.collect({[[1], [1]]})}, {roots.slice(nil, 0)});
roots = distributeRoots.value(modeState, lastRoots); roots = distributeRoots.value(modeState, lastRoots);
roots.size.postln;
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)]}), sectionCount, subsectionCount]); [fr, 36.midicps * pow(2, [1, 0, 1, 2][part]) * frToFloat.value(fr)]}), sectionCount, subsectionCount]);
@ -416,9 +438,13 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
ensData[part] = ensData[part] ++ musicData; ensData[part] = ensData[part] ++ musicData;
partStates[part] = partState; partStates[part] = partState;
//if(collectRoots.value(modeState).size == 1, {
// if(part != 0, {bassData[part - 1] = bassData[part - 1] ++ genBassPart.value(roots[2][0], curLen)});
//});
thisThread.randSeed = Date.seed; thisThread.randSeed = Date.seed;
6.do({arg register; 6.do({arg register;
musicData = genAccompPart.value(modeState, temporalData[part], curLen, pow(2, part + register), part); musicData = genAccompPart.value(modeState, temporalData[part], curLen, pow(2, part + register), part, register);
accompData[part][register] = accompData[part][register] ++ musicData; accompData[part][register] = accompData[part][register] ++ musicData;
}); });
@ -426,17 +452,27 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
subsectionCount = subsectionCount + 1; subsectionCount = subsectionCount + 1;
thisThread.randSeed = (seed + (sectionCount * 100) + subsectionCount); thisThread.randSeed = (seed + (sectionCount * 100) + subsectionCount);
modeState = advanceMode.value(modeState, lastCadenceState);
if(collectRoots.value(modeState).size == 1, { if(collectRoots.value(modeState).size == 1, {
sectionCount = sectionCount + 1; sectionCount = sectionCount + 1;
subsectionCount = 1; subsectionCount = 1;
lastCadenceState = modeState; lastCadenceState = modeState;
if(curLen > 0, {
bassData[0] = bassData[0] ++ genBassPart.value(roots[0][0].postln, lastCadencePoint.postln, curLen);
}); });
//bassData[0] = bassData[0] ++ genBassPart.value(roots[0][0].postln, curLen);
lastCadencePoint = curLen + temporalData[0].size;
lastCadencePoint.postln;
});
modeState = advanceMode.value(modeState, lastCadenceState);
curLen = curLen + temporalData[0].size; curLen = curLen + temporalData[0].size;
}); });
[ensData, accompData, sectionData, sectionNavDict] [ensData, accompData, sectionData, bassData.postln, sectionNavDict]
}; };
//~genMusicData.value(100)
) )

View file

@ -9,7 +9,7 @@ var formatPatternData;
~accompBus = Bus.audio(s, 1); ~accompBus = Bus.audio(s, 1);
~clickBus = Bus.audio(s, 1); ~clickBus = Bus.audio(s, 1);
~busses = 6.collect({Bus.audio(s, 1)}); ~busses = 7.collect({Bus.audio(s, 1)});
SynthDef(\masterPlayerControl_ ++ ~hash, { SynthDef(\masterPlayerControl_ ++ ~hash, {
var sigs, sigsPanned, masterSig, imp; var sigs, sigsPanned, masterSig, imp;
@ -35,7 +35,7 @@ SynthDef(\transport_ ++ ~hash, {arg measure = 0, beat = 0, section = 0, subsecti
SynthDef(\click_ ++ ~hash, {arg beat = 0, gate = 1, dur = 1; SynthDef(\click_ ++ ~hash, {arg beat = 0, gate = 1, dur = 1;
Out.ar(~busses[5], 10 * BPF.ar(WhiteNoise.ar * EnvGen.kr(Env.perc(0.01, 0.1), gate), 440 * ((beat <= 1) + 1), 0.02)); Out.ar(~busses[6], 10 * BPF.ar(WhiteNoise.ar * EnvGen.kr(Env.perc(0.01, 0.1), gate), 440 * ((beat <= 1) + 1), 0.02));
EnvGen.kr(Env.sine(dur), gate, doneAction: 2); EnvGen.kr(Env.sine(dur), gate, doneAction: 2);
}).add; }).add;
@ -51,7 +51,11 @@ SynthDef(\accomp_ ++ ~hash, {arg freq = 440, amp = 1, attack = 1, dur = 1, gate
SynthDef(\clip_ ++ ~hash, {arg dur = 1, gate = 1, bin = 0, bus = 0; SynthDef(\clip_ ++ ~hash, {arg dur = 1, gate = 1, bin = 0, bus = 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, 240), 2))
Out.ar(bus, (In.ar(bin)).clip(0, 1) * 10 * pow(Line.kr(0, 1, 10), 2)) Out.ar(bus, (In.ar(bin)).clip(0, 1) * 50 * pow(Line.kr(0, 1, 10), 2))
}).add;
SynthDef(\bass_ ++ ~hash, {arg freq = 440, amp = 1, dur = 1, attack = 1, decay = 1, release = 1, gate = 1, direction = 1, bus = 0;
Out.ar(bus, (SinOsc.ar(freq) * 0.3 * amp * EnvGen.kr(Env.adsr(attack, decay, 0.5, release, curve: \sqr), gate, doneAction: 2)))
}).add; }).add;
@ -74,8 +78,8 @@ formatPatternData = {arg musData, measureLen;
//~~~~~~~~~~~~GENERATE PATTERNS~~~~~~~~~~~~ //~~~~~~~~~~~~GENERATE PATTERNS~~~~~~~~~~~~
~genPatterns = {arg ensData, accompData, sectionData; ~genPatterns = {arg ensData, accompData, bassData, sectionData;
var measureLen, ensDataFormatted, accompDataFormatted, dUnit, section, subsection; var measureLen, ensDataFormatted, accompDataFormatted, bassDataFormatted, dUnit, section, subsection;
measureLen = (( measureLen = ((
ensData.collect({arg partData; partData.last[1]}) ++ ensData.collect({arg partData; partData.last[1]}) ++
@ -84,6 +88,7 @@ formatPatternData = {arg musData, measureLen;
ensDataFormatted = formatPatternData.value(ensData, measureLen); ensDataFormatted = formatPatternData.value(ensData, measureLen);
accompDataFormatted = formatPatternData.value(accompData.flatten, measureLen); accompDataFormatted = formatPatternData.value(accompData.flatten, measureLen);
bassDataFormatted = formatPatternData.value(bassData[..0], measureLen);
dUnit = 8.reciprocal; dUnit = 8.reciprocal;
measureLen.collect({arg measure; measureLen.collect({arg measure;
@ -113,10 +118,25 @@ formatPatternData = {arg musData, measureLen;
\sustain, Pseq(musData[2] * dUnit), \sustain, Pseq(musData[2] * dUnit),
\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] * 1 * dUnit),
\bout, Pseq(musData[4] + 6) \bout, Pseq(musData[4] + 6)
) )
}) ++ }) ++
bassDataFormatted[measure][..0].postln.collect({arg musData, m;
Pbind(
\instrument, \bass_ ++ ~hash,
\freq, Pseq(musData[0].replace(0, Rest(0)) * [2, 4, 8][m]),
\dur, Pseq(musData[1] * dUnit),
\sustain, Pseq(musData[2] * dUnit),
\attack, Pseq(musData[3] * dUnit),
\decay, Pseq(musData[4]),
\release, Pseq(musData[5]),
\amp, 1,
//\amp, 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})}))
\bus, ~busses[4].index
)
}) ++
[ [
Pbind( Pbind(
\instrument, \transport_ ++ ~hash, \instrument, \transport_ ++ ~hash,