def gen(self, path, nnotes=200, motif=None): self.t = 0 if motif: motif = parse(motif) print "="*60 print "Generating Shepard Tones" tobj = TrackObj(trackName="Track1") for i in range(nnotes): dur = 1 if motif: j,dur = motif[i % len(motif)] if j == 'r': self.t += dur*self.ticksPerBeat continue else: j = i % 12 #print i, j notes = self.getChord(j, dur) self.t += dur*self.ticksPerBeat for note in notes: tobj.addNote(note) midiObj = MidiObj() midiObj.addTrack(tobj) midiObj.saveAsJSON(path) mpath = path.replace(".json", ".mid") midiObj.saveAsMidi(mpath)
def genTrack(): t = TrackObj() for i in range(10): t0 = 400*i v1 = 50 v2 = 90 v3 = 30 t.addNote(Note(50, t0, v1, 25)) t.addNote(Note(51, t0+50, v2, 25)) t.addNote(Note(52, t0+200, v2, 50)) t.addNote(Note(53, t0+300, v2, 25)) t.setMaxTime(t0 + 400) return t
def genTrackBasicBeat1(resolution): t = TrackObj() numMeasures = 8 tpb = resolution # ticks per beat bpmeasure = 4 # beats per measure for m in range(numMeasures): b = m * bpmeasure t0 = b * tpb print "b: %3d t: %8.3f" % (b, t0) # c p t v dur t.addNote(Note(0, 50, t0, 90, 0.25 * tpb)) t.addNote(Note(0, 50, t0 + 1 * tpb, 70, 0.25 * tpb)) t.addNote(Note(0, 50, t0 + 2 * tpb, 70, 0.25 * tpb)) t.addNote(Note(0, 50, t0 + 3 * tpb, 70, 0.25 * tpb)) t.setMaxTime(t0 + bpmeasure * tpb) m = MidiObj(resolution=tpb) m.addTrack(t) return m
def remapv(self, tObj, v, tau=None, rtObj=None, ch=0, inst=0): print "------------------------" print "remapv", v T = tObj.getMaxTime() if rtObj == None: rtObj = TrackObj() rtObj.addEvent(ProgChangeEvent(0, ch, inst)) print "T:", T if tau == None: tau = T tau = T rmap = RissetMapper(T, tau) reMax = rmap.get_te(T, 0)[0] print "rmap(T):", reMax tvals = tObj.events.keys() tvals.sort() nNotes = 0 for tv in tvals: for ev in tObj.events[tv]: if not isinstance(ev, Note): print "Skipping non note object", ev.__class__.__name__ continue tl = ev.t0 dur = ev.dur tes = rmap.get_te(tl, v) #print "tl: %7.2f te: %s" % (tl, tes) for te in tes: rate = rmap.get_rate(te, v) p = self.power(rate) #print "v: %d te: %6.2f rate: %5.2f p: %5.1f" % (v, te, rate, p) dr = dur / rate if rate > 2: dr = dur note = Note(ch, ev.pitch, round(te), round(p * ev.velocity), dr) rtObj.addNote(note) nNotes += 1 #rtObj.resolution = tObj.resolution rtObj.instruments = [inst] rtObj.channels = [ch] print "nNotes:", nNotes return rtObj
def remapTrack(self, tobj, tau=None, vLow=-2, vHigh=2, inst=127, fch=None, res=None, repeats=None): if res == None: res = self.resolution if res == None: print "Cannot remap track without resolution" return mObj = MidiObj(resolution=res) T = tobj.getMaxTime() print "T:", T if tau == None: tau = T tau = T rmap = RissetMapper(T, tau) reMax = rmap.get_te(T, 0)[0] print "rmap(T):", reMax ch = 0 for v in range(vLow, vHigh + 1): print "v: ", v #rtObj = self.remapv(tobj, v, tau, ch=ch, inst=10+v) if fch != None: ch = fch rtObj = self.remapv(tobj, v, tau, ch=ch, inst=inst) rtObj.trackName = "risset v=%s" % v if repeats: rt0 = TrackObj() for i in range(repeats): rt0.append(rtObj) rtObj = rt0 mObj.addTrack(rtObj) ch += 1 #mObj.resolution = rtObj.resolution mObj.loop = True return mObj
def gen(self, path, nnotes=200, motif=None): self.t = 0 if motif: motif = parse(motif) print "=" * 60 print "Generating Shepard Tones" tobj = TrackObj(trackName="Track1") for i in range(nnotes): dur = 1 if motif: j, dur = motif[i % len(motif)] else: j = i % 12 #print i, j notes = self.getChord(j, dur) for note in notes: tobj.addNote(note) midiObj = MidiObj() midiObj.addTrack(tobj) midiObj.saveAsJSON(path)
def genShepard(path, nvoices=5, noctaves=5, nnotes=200, motif=None): if motif: motif = parse(motif) print "=" * 60 print "Generating Shepard Tones" tobj = TrackObj(trackName="Track1") t = 0 for v in range(nvoices): sv = ShepVoice(noctaves, 12 * v) for i in range(nnotes): j = i dur = 1 if motif: j, dur = motif[i % len(motif)] #print j, dur tOn, note = sv.getNote(t, j, dur) t += sv.ticksPerBeat * dur if note: #print i, note.toList() tobj.addNote(note) midiObj = MidiObj() midiObj.addTrack(tobj) midiObj.saveAsJSON(path)
def genTrack(): t = TrackObj() for i in range(10): t0 = 400*i v1 = 50 v2 = 90 v3 = 30 t.addNote(Note(50, t0, v1, 25)) t.addNote(Note(51, t0+50, v2, 25)) t.addNote(Note(52, t0+200, v2, 50)) t.addNote(Note(53, t0+300, v2, 25)) t.setMaxTime(t0 + 400) return t #t = genTrack() t = TrackObj("BluesRhythm1.json") t.saveAsJSON("foo.json") print "t.maxTime", t.getMaxTime() print "==========================================" print "1_2" rt1 = t.rescaleByTime(t.rescaleTime(0.25, 0.5)) rt1.scalePower(0, 0.3) save(rt1, "risset0.25_0.5.json") print "==========================================" rt2 = t.rescaleByTime(t.rescaleTime(0.5, 1)) rt2.scalePower(0.3, 1) save(rt2, "risset0.5_1.json") rt3 = t.rescaleByTime(t.rescaleTime(1, 2))
from PVMidi import TrackObj, Note t1 = TrackObj("risset0.25_0.5.json") t2 = TrackObj("risset0.5_1.json") t3 = TrackObj("risset1_2.json") t4 = TrackObj("risset2_4.json") print "t1 tMax: %8.2f %5d" % (t1.getMaxTime(), t1.getNumNotes()) print "t2 tMax: %8.2f %5d" % (t2.getMaxTime(), t2.getNumNotes()) print "t3 tMax: %8.2f %5d" % (t3.getMaxTime(), t3.getNumNotes()) print "t4 tMax: %8.2f %5d" % (t4.getMaxTime(), t4.getNumNotes()) rt = TrackObj() rt.append(t1) rt.append(t2) rt.append(t3) rt.append(t4) rt.saveAsJSON("rissetvoice.json") rt = TrackObj("rissetvoice.json") print "rt tMax: %8.2f %5d" % (rt.getMaxTime(), rt.getNumNotes())