-
Notifications
You must be signed in to change notification settings - Fork 0
/
xo.sc
65 lines (60 loc) · 2.08 KB
/
xo.sc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
+ IsoFluent {
*prXoAddDurs {|durs, e|
^if((e.asString != "o"),
{durs.add(1);},
{
if((durs.size == 0) || (durs.last == \rest),
{durs.add(\rest);},
{durs[durs.size -1] = durs.last+1;}
);
durs;
}
)
}
*prXoInitVoiceNotes {|totalVoices|
^totalVoices.collect({[]})
}
*prXoAddVoiceNotesEvent {|voices, e|
^case(
{e.asString == "x"}, {voices.collect(_.add(1))},
{e.asString == "o"}, {voices.collect(_.add(\rest))},
{e.asString.asNumberIfPossible.isNumber}, {
var index = e.asString.asNumberIfPossible;
voices.collect({|voice, i| if(i == index,
{voice.add(1)},
{voice.add(\rest)})
})
},
{
voices.collect(_.size).every(_ == 0)
|| voices.flatten.every(_ == \rest)
}, {voices.collect(_.add(\rest))},
{voices}
)
}
*prXoMakeTranspFns {|mappingsNotes|
^mappingsNotes.collect({|voice| _*voice})
}
*prXoMakeMappings {|soundstring, totalVoices|
var acc = (
durs: List [],
notes: IsoFluent.prXoInitVoiceNotes(totalVoices) // actually, this builds a list of 1 || \rest which will be used as transp fn's later on
);
^soundstring.inject(acc, {|acc, e|
var durs = acc.durs;
var notesVoices = acc.notes;
(
durs: IsoFluent.prXoAddDurs(durs, e),
notes: IsoFluent.prXoAddVoiceNotesEvent(notesVoices, e)
);
});
}
*xo {|xos|
^{|fluentCan, def|
var xos_ = if(xos.isNil || xos == "", {"x"}, {xos}); // make sure we have a valid xo string... TODO improve this.
var mappings = IsoFluent.prXoMakeMappings(xos_, fluentCan.tempos.size);
var transps = IsoFluent.prXoMakeTranspFns(mappings.notes);
fluentCan.compTransps(transps);
};
}
}