Created
April 30, 2019 22:57
-
-
Save lvm/679ce48625f2d2be6f71da3857000e99 to your computer and use it in GitHub Desktop.
ageispolis midi.scd
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
z = SimpleMIDIFile.read("/home/mauro/Downloads/General MIDIMan - Ageispolis.mid") | |
( | |
x = { |smf, channel, track| | |
var pending = IdentitySet.new, buf = MIDIRecBuf(\seq).absoluteOnsets_(true), | |
events = smf.noteEvents(channel, track).sort { |a, b| | |
if(a[1] == b[1]) { | |
a[2] > b[2] // equal time, put noteOn first | |
} { | |
a[1] < b[1] // earlier time first | |
} | |
}, | |
// prevTime = events[0][1], | |
ppq = smf.division; | |
events.do { |event| | |
var note; | |
case | |
{ event[2] == \noteOn and: { event[5] > 0 } } { | |
// store for now with absolute times, not deltas | |
// length will be filled in during \noteOff processing | |
note = SequenceNote(event[4], event[1] / ppq, event[1], event[5]); | |
buf.add(note); | |
pending.add(note); | |
} | |
{ event[2] == \noteOff or: { event[5] == 0 } } { | |
note = pending.select { |note| note.freq == event[4] }.minItem(_.length); | |
if(note.notNil) { | |
note.length = (event[1] - note.length) / ppq; | |
pending.remove(note); | |
} { | |
"noteOff missing a noteOn: %".format(event).warn; | |
}; | |
}; | |
}; | |
if(pending.notEmpty) { | |
"These notes are missing noteOff events:".postln; | |
pending.as(Array).sort { |a, b| a.dur < b.dur }.do(_.postln); | |
}; | |
// pending | |
buf // function return value | |
}; | |
) | |
a = x.(z) | |
a.convertToDeltas | |
a.notes[42..80].collect(_.postln) | |
46.percussion | |
f.setProgram(9,10) | |
( | |
~age[0] = Pbind( | |
\type,\md, | |
\chan, 9, | |
\seqnote, Pseq(a.notes[42..], inf), | |
#[midinote, delta, sustain, amp], Pfunc { |ev| | |
var note = ev[\seqnote]; | |
// [note.freq, note.dur, note.length, note.args.linlin(0, 127, 0.05, 0.75)] | |
[note.freq, note.dur, note.length, note.args.linlin(0, 127, 0.05, 0.75)] | |
}, | |
\stretch, 1/2, | |
); | |
) | |
( | |
~age[1] = { |in| Splay.ar(SoundIn.ar((9..14)))!2 }; | |
~age[2] = \filter -> { |in,wave=1,crush=1,pitch=1| | |
OffsetOut.ar(0, | |
Select.ar(MouseX.kr > 0.5, | |
[ | |
in, | |
// Stutter.ar(in!2, 1, FSinOsc.kr(1).range(0.1,1), 0.1, 2), | |
// Stutter.ar(in, 1, 0.1, 1, 1), | |
PitchShift.ar( | |
BinFreeze.ar(Decimator.ar(Stutter.ar(in, 1, 5, 0.1, 1)!2, 44100/crush), 4096, 2, 1) | |
,pitchRatio:pitch), | |
BlackNoise.ar(23), | |
// in, | |
// Stutter.ar(PitchShift.ar(RLPF.ar(PinkNoise.ar(0.5), FSinOsc.kr(1).range(60,1260), FSinOsc.kr(0.1).range(0.1,1)), pitchRatio:pitch), 1, 1, 10), | |
] | |
// .scramble | |
) * 15.dbamp | |
) | |
}; | |
~page = Pbind( | |
\type, \set, \id, ~age.nodeID, \args, #[\wave,\crush,\pitch], | |
\wave, "92".hexbeat.pseq.stutter([1,1,1,2,1,1,4,1,1,8,1].pseq), | |
\crush, Pwhite(1,12), | |
\pitch, Pstutter(8, Pwhite(1,2)), | |
\dur, 1/8 | |
); | |
// \dur, 1/[8,4,16,2,1].pxrand); | |
) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment