adding bass part
This commit is contained in:
parent
c8fff752fb
commit
c25347be55
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.
Binary file not shown.
|
|
@ -236,8 +236,8 @@ masterView = {arg win;
|
|||
|
||||
faderView = {arg win;
|
||||
var view, masterIndicators, trackIndicators, master, tracks;
|
||||
var partAbbr = ["*", "III", "II", "I", "accomp", "click"];
|
||||
var trackNames = ["*", "III", "II", "I", "accomp", "click"];
|
||||
var partAbbr = ["*", "III", "II", "I", "accomp_I", "accomp_II", "click"];
|
||||
var trackNames = ["*", "III", "II", "I", "accomp_I", "accomp_II", "click"];
|
||||
var partVols, partMutes, partPans;
|
||||
var masterMute, masterVol;
|
||||
|
||||
|
|
@ -264,7 +264,7 @@ faderView = {arg win;
|
|||
master = buildMasterFader.value(view, masterVol, masterMute, masterIndicators);
|
||||
tracks = {arg part;
|
||||
buildTrackFader.value(view, trackNames[part], part, 0);
|
||||
} ! 6;
|
||||
} ! 7;
|
||||
view.layout_(HLayout(master, nil, *tracks))
|
||||
};
|
||||
|
||||
|
|
|
|||
|
|
@ -22,8 +22,8 @@ s.waitForBoot({
|
|||
~musicData = ~genMusicData.value(seed);
|
||||
~scoreData = ~genScoreData.value(~musicData[0]);
|
||||
~sectionData = ~musicData[2];
|
||||
~sectionNavDict = ~musicData[3].postln;
|
||||
~patterns = ~genPatterns.value(~musicData[0], ~musicData[1], ~sectionData);
|
||||
~patterns = ~genPatterns.value(~musicData[0], ~musicData[1], ~musicData[3], ~sectionData);
|
||||
~sectionNavDict = ~musicData[4].postln;
|
||||
~isPlaying = false;
|
||||
};
|
||||
|
||||
|
|
@ -34,7 +34,7 @@ s.waitForBoot({
|
|||
"loading app".postln;
|
||||
~genAll.value(19800725);
|
||||
~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;
|
||||
"ready".postln;
|
||||
|
||||
|
|
|
|||
|
|
@ -4,7 +4,7 @@ genMode, hdChoose, wchooseDict, collectRoots,
|
|||
initModeState, advanceMode,
|
||||
initTemporalState, genTemporalData,
|
||||
initPartStates, distributeRoots,
|
||||
genEnsemblePart, genAccompPart, genMusicData, genScoreData, genPatterns;
|
||||
genEnsemblePart, genAccompPart, genBassPart, genMusicData, genScoreData, genPatterns;
|
||||
|
||||
|
||||
//~~~~~~~~~~~~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)});
|
||||
buffer = 16.collect({0});
|
||||
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 = if(cadence, {32.rand}, {((timeToNextEvent - flourish.size - buffer.size) / 2).asInteger.rand});
|
||||
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]});
|
||||
after = (timeToNextEvent - before.size - flourish.size - buffer.size).collect({[0, 1].wchoose([genDensity, 1].normalizeSum)});
|
||||
flourish = before ++ flourish ++ after;
|
||||
|
|
@ -349,18 +350,26 @@ genEnsemblePart = {arg partState, modeState, temporalData, roots, part, offset;
|
|||
|
||||
|
||||
//~~~~~~~~~~~~GENERATE ELECTRONIC ACCOMPANIMENT~~~~~~~~~~~~
|
||||
genAccompPart = {arg modeState, temporalData, offset, trans, part;
|
||||
genAccompPart = {arg modeState, temporalData, offset, trans, part, register;
|
||||
var firstChange, accompData;
|
||||
firstChange = false;
|
||||
accompData = [];
|
||||
temporalData.do({arg val, tS;
|
||||
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, {
|
||||
var sel, freq, amp;
|
||||
sel = wchooseDict.value(modeState, 0.1);
|
||||
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]);
|
||||
firstChange = true;
|
||||
});
|
||||
|
|
@ -368,17 +377,27 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
|
|||
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~~~~~~~~~~~~
|
||||
~genMusicData = {arg seed;
|
||||
var totalDur, dUnit, totalLen, curLen,
|
||||
modeState, temporalState, partStates, lastCadenceState,
|
||||
ensData, accompData, sectionData,
|
||||
modeState, temporalState, partStates, lastCadenceState, lastCadencePoint,
|
||||
ensData, accompData, bassData, sectionData,
|
||||
roots, lastRoots, sectionCount, subsectionCount, sectionNavDict;
|
||||
|
||||
thisThread.randSeed = seed;
|
||||
|
||||
totalDur = 3 * 60;
|
||||
totalDur = 6 * 60;
|
||||
dUnit = 8.reciprocal;
|
||||
totalLen = (totalDur / dUnit).round(16);
|
||||
curLen = 0;
|
||||
|
|
@ -387,8 +406,10 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
|
|||
temporalState = initTemporalState.value;
|
||||
partStates = initPartStates.value;
|
||||
lastCadenceState = modeState.deepCopy;
|
||||
lastCadencePoint = 0;
|
||||
|
||||
ensData = 4.collect({[]});
|
||||
bassData = 3.collect({[]});
|
||||
accompData = 4.collect({6.collect({[]})});
|
||||
sectionData = Dictionary.new; //Dictionary.with(*[0->4]);
|
||||
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)});
|
||||
roots = distributeRoots.value(modeState, lastRoots);
|
||||
roots.size.postln;
|
||||
|
||||
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]);
|
||||
|
|
@ -416,9 +438,13 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
|
|||
ensData[part] = ensData[part] ++ musicData;
|
||||
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;
|
||||
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;
|
||||
});
|
||||
|
||||
|
|
@ -426,17 +452,27 @@ genAccompPart = {arg modeState, temporalData, offset, trans, part;
|
|||
|
||||
subsectionCount = subsectionCount + 1;
|
||||
thisThread.randSeed = (seed + (sectionCount * 100) + subsectionCount);
|
||||
modeState = advanceMode.value(modeState, lastCadenceState);
|
||||
|
||||
if(collectRoots.value(modeState).size == 1, {
|
||||
sectionCount = sectionCount + 1;
|
||||
subsectionCount = 1;
|
||||
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;
|
||||
});
|
||||
|
||||
[ensData, accompData, sectionData, sectionNavDict]
|
||||
[ensData, accompData, sectionData, bassData.postln, sectionNavDict]
|
||||
};
|
||||
|
||||
//~genMusicData.value(100)
|
||||
)
|
||||
|
||||
|
|
|
|||
|
|
@ -9,7 +9,7 @@ var formatPatternData;
|
|||
~accompBus = 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, {
|
||||
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;
|
||||
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);
|
||||
}).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;
|
||||
//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;
|
||||
|
||||
|
||||
|
|
@ -74,8 +78,8 @@ formatPatternData = {arg musData, measureLen;
|
|||
|
||||
|
||||
//~~~~~~~~~~~~GENERATE PATTERNS~~~~~~~~~~~~
|
||||
~genPatterns = {arg ensData, accompData, sectionData;
|
||||
var measureLen, ensDataFormatted, accompDataFormatted, dUnit, section, subsection;
|
||||
~genPatterns = {arg ensData, accompData, bassData, sectionData;
|
||||
var measureLen, ensDataFormatted, accompDataFormatted, bassDataFormatted, dUnit, section, subsection;
|
||||
|
||||
measureLen = ((
|
||||
ensData.collect({arg partData; partData.last[1]}) ++
|
||||
|
|
@ -84,6 +88,7 @@ formatPatternData = {arg musData, measureLen;
|
|||
|
||||
ensDataFormatted = formatPatternData.value(ensData, measureLen);
|
||||
accompDataFormatted = formatPatternData.value(accompData.flatten, measureLen);
|
||||
bassDataFormatted = formatPatternData.value(bassData[..0], measureLen);
|
||||
dUnit = 8.reciprocal;
|
||||
|
||||
measureLen.collect({arg measure;
|
||||
|
|
@ -113,10 +118,25 @@ formatPatternData = {arg musData, measureLen;
|
|||
\sustain, Pseq(musData[2] * dUnit),
|
||||
\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[2] * 0.9 * dUnit),
|
||||
\attack, Pseq(musData[2] * 1 * dUnit),
|
||||
\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(
|
||||
\instrument, \transport_ ++ ~hash,
|
||||
|
|
|
|||
Loading…
Reference in a new issue