Example #1
0
    def writemidi( self, filedir="" ):
        # sort the events by absoluteticks
        # put all tempo, time signature data in track 0, as well as any instrument or track names

        # first grab the track name
        if self.texts[0][0].text != "":
            trackname = MIDI.TrackNameEvent(text=self.texts[0][0].text, tick=0)
            trackname.absoluteticks = 0
            # for some reason, the data doesn't get through via the text above.
            trackname.data = [ ]
            i = 0
            while i < len(self.texts[0][0].text):
                trackname.data.append( ord( self.texts[0][0].text[i] ) ) 
                i+= 1
            tracks = [[ trackname]] 
            del trackname # so that when we reuse this variable later it doesn't change the above
        else:
            tracks = [[]]
        # put all tempo, time signature data in track 0
        tracks[0] += self.texts[0][1:] + self.tempos+self.timesignatures+self.notes[0]
        # sort everything
        tracks[0].sort(key=operator.attrgetter('absoluteticks'))

        # then grab the instrument
        if self.channels[0] != 9 and self.instruments[0]:
            tracks[0].insert(0, MIDI.ProgramChangeEvent( value=self.instruments[0],
                            channel=self.channels[0]  ) )

        for i in range(1,len(self.notes)):
            # sort each track separately
            # first grab the track name
            if self.texts[i][0].text != "":
                trackname = MIDI.TrackNameEvent(text=self.texts[i][0].text, tick=0)
                # for some reason, the data doesn't get through via the text above.
                trackname.data = [ ]
                trackname.absoluteticks = 0
                j = 0
                while j < len(self.texts[i][0].text):
                    trackname.data.append( ord( self.texts[i][0].text[j] ) ) 
                    j += 1
                tracks.append( [ trackname ] )
                del trackname # so that when we reuse this variable later it doesn't change the above
            else:
                tracks.append( [] )
            # then grab the instrument
            tracks[i] += self.texts[i][1:] + self.notes[i] 
            tracks[i].sort(key=operator.attrgetter('absoluteticks'))
            if self.channels[i] != 9 and self.instruments[i]:
                tracks[i].insert(0, MIDI.ProgramChangeEvent( value=self.instruments[i],
                            channel=self.channels[i] ))

        # now that everything is sorted globally,
        # make sure that the local ticks are correct.
        tickdivisor = config.EDITresolution
        for i in range(len(tracks)):
            tracks[i].insert(0, MIDI.ControlChangeEvent( tick=0, channel=self.channels[i],
                                                        data=[7,127]) )
        for track in tracks:
            previouseventabsoluteticks = 0
            for event in track:
                try:
                    thiseventabsoluteticks = int(event.absoluteticks)
                except AttributeError:
                    thiseventabsoluteticks = 0
                # number of ticks between previous event and the current event
                tickmeoff = thiseventabsoluteticks - previouseventabsoluteticks
                event.tick = tickmeoff
                # check to see how small we can get the resolution
                tickdivisor = gcd( tickdivisor, tickmeoff )
                # set up the ticks for next event
                previouseventabsoluteticks = thiseventabsoluteticks
         
        if config.EDITresolution % tickdivisor:
            Error(" min RESOLUTION does not divide our EDITresolution.  something is funky ")

        # prep the new pattern for creating
        newpattern = MIDI.Pattern( resolution=config.EDITresolution/tickdivisor )
        for track in tracks:
            if tickdivisor > 1:
                for event in track:
                    # divide up the relative ticks
                    event.tick /= tickdivisor
                    # keep absolute ticks in the EDITresolution
            if track[-1].name != "End of Track":
                # add an end of track if it isn't there
                track.append( MIDI.EndOfTrackEvent( tick=config.EDITresolution/tickdivisor ) )
            newpattern.append( MIDI.Track(track) )
        
        if filedir == "":
            MIDI.write_midifile(self.midifile, newpattern)
        else:
            MIDI.write_midifile(filedir, newpattern)
Example #2
0
def main(argv):
    import getopt
    from wavestream import WaveReader

    def usage():
        print(
            'usage: %s [-M|-F] [-n pitchmin] [-m pitchmax] [-t threshold] '
            '[-o out.mid] [-w wsize] [-p instru] wav ...' % argv[0])
        return 100

    try:
        (opts, args) = getopt.getopt(argv[1:], 'MFn:m:t:o:w:p:')
    except getopt.GetoptError:
        return usage()
    pitchmin = 70
    pitchmax = 400
    threshold = 0.97
    outpath = 'out.mid'
    wsize = 50
    instru = 0
    attack = 70
    release = 70
    for (k, v) in opts:
        if k == '-M': (pitchmin, pitchmax) = (75, 200)  # male voice
        elif k == '-F': (pitchmin, pitchmax) = (150, 300)  # female voice
        elif k == '-n': pitchmin = int(v)
        elif k == '-m': pitchmax = int(v)
        elif k == '-t': threshold = float(v)
        elif k == '-o': outpath = v
        elif k == '-w': wsize = int(v)
        elif k == '-p': instru = int(v)
    contour = None
    for path in args:
        src = WaveReader(path)
        if contour is None:
            contour = PitchContour(src.framerate,
                                   pitchmin=pitchmin,
                                   pitchmax=pitchmax,
                                   threshold=threshold)
        contour.load(src.readraw(), src.nframes)
        src.close()
    events = [midi.ProgramChangeEvent(tick=0, channel=0, data=[instru])]
    window = []
    km0 = 0
    kt = 0
    kd = 0
    piano = open("../server/piano.txt", "w")
    for p in contour.segments:
        if p == 0:
            k = 0
        else:
            i = getpt(FRANGES, p)
            (_, k) = FRANGES[i - 1]
        window.append(k)
        if len(window) < wsize: continue
        window = window[1:]
        km1 = majority(window)
        if km0 == km1:
            kd += 1
        else:
            print km0, kd
            piano.write(str(km0) + ' ' + str(kd) + '\r\n')
            if km0 == 0:
                kt += kd
            else:
                events.append(
                    midi.NoteOnEvent(tick=kt, channel=0, data=[km0, attack]))
                events.append(
                    midi.NoteOffEvent(tick=kd, channel=0, data=[km0, release]))
                kt = 0
            kd = 0
            km0 = km1
    piano.write('EOF')
    piano.close()
    events.append(midi.EndOfTrackEvent(tick=0, data=[]))
    pat = midi.Pattern(tracks=[events])
    midi.write_midifile(outpath, pat)
    return
Example #3
0
# In[37]:

pattern = midi.Pattern(format=1,
                       resolution=480,
                       tracks=[
                           midi.Track([
                               midi.TimeSignatureEvent(tick=0,
                                                       data=[4, 2, 24, 8]),
                               midi.KeySignatureEvent(tick=0, data=[0, 0]),
                               midi.SetTempoEvent(tick=0, data=[7, 161, 32]),
                               midi.ControlChangeEvent(tick=0,
                                                       channel=0,
                                                       data=[121, 0]),
                               midi.ProgramChangeEvent(tick=0,
                                                       channel=0,
                                                       data=[0]),
                               midi.ControlChangeEvent(tick=0,
                                                       channel=0,
                                                       data=[7, 100]),
                               midi.ControlChangeEvent(tick=0,
                                                       channel=0,
                                                       data=[10, 64]),
                               midi.ControlChangeEvent(tick=0,
                                                       channel=0,
                                                       data=[91, 0]),
                               midi.ControlChangeEvent(tick=0,
                                                       channel=0,
                                                       data=[93, 0]),
                               midi.PortEvent(tick=0, data=[0])
                           ])
Example #4
0
INSTRUMENT = 40
# Choose the instrument rendering the music
BASE_TICK = 25

unigrams = open(INPUT_FILE, "r")

prev_unigram = 0
# No sound to start with
tick_count = 0

pattern = midi.Pattern()

track = midi.Track()
pattern.append(track)

set_instrument_event = midi.ProgramChangeEvent()
set_instrument_event.set_value(INSTRUMENT)
track.append(set_instrument_event)

set_tempo_event = midi.SetTempoEvent()
set_tempo_event.set_bpm(BPM)
track.append(set_tempo_event)

for unigram_string in unigrams:
    tick_count = tick_count + 1
    unigram = int(unigram_string)
    if unigram != prev_unigram:
        note = unigram + (LOWEST_NOTE - 1)
        previous_note = prev_unigram + (LOWEST_NOTE - 1)

        if prev_unigram != 0:  # First turn off any notes that are playing already
Example #5
0
def vector_to_midi(vector):
    '''Given a np array (vector.data), returns a python midi pattern'''
    pattern = midi.Pattern(resolution=960)
    #first, separate tracks
    tracklist = {}
    for i in xrange(2, vector.shape[0], 4):
        for j in xrange(0, vector.shape[1]):
            track = vector[i:i + 4, j]
            if np.sum(track) > 0:
                instrument = int(track[0])
                if instrument not in tracklist:
                    tracklist[instrument] = np.vstack(
                        (vector[0:2, j].reshape(-1, 1), track.reshape(-1, 1)))
                else:
                    tracklist[instrument] = np.hstack(
                        (tracklist[instrument],
                         np.vstack((vector[0:2, j].reshape(-1, 1),
                                    track.reshape(-1, 1)))))

    for k, track in tracklist.iteritems():
        miditrack = midi.Track()
        pattern.append(miditrack)
        bpm = track[1, 0]
        tempoevent = midi.SetTempoEvent(tick=0, bpm=bpm)
        miditrack.append(tempoevent)
        instrument = int(track[2, 0])
        fontevent = midi.ProgramChangeEvent(tick=0, value=instrument)
        miditrack.append(fontevent)
        if not np.array_equal(bpm * np.ones(track.shape[1]), track[1, :]):
            print 'Tempo changes. Code assumes it doesn\'t. Contact Jingyi.'

        event_tick = 0
        track_duration = np.max(track[0, :] + track[-1, :])
        active_notes = {}
        start_times = track[0, :]
        for t in xrange(0, int(track_duration) + 1):
            for pitch in active_notes:
                active_notes[pitch] -= 1

            negs = [k for k, v in active_notes.iteritems() if v < 0]
            for n in negs:
                active_notes.pop(n)

            while 0 in active_notes.values():
                pitches = [k for k, v in active_notes.iteritems() if v == 0]
                for pitch in pitches:
                    off = midi.NoteOffEvent(tick=t - event_tick, pitch=pitch)
                    miditrack.append(off)
                    active_notes.pop(pitch)
                    event_tick = t

            #run through track to add on/off events
            if t in start_times:
                ni = np.where(t == start_times)
                for n in ni[0]:
                    note = track[:, n]
                    start_time = int(note[0])
                    pitch = int(note[3])
                    velocity = int(note[4])
                    duration = int(note[5])
                    active_notes[pitch] = duration
                    on = midi.NoteOnEvent(tick=t - event_tick,
                                          velocity=velocity,
                                          pitch=pitch)
                    miditrack.append(on)
                    event_tick = start_time

        miditrack.append(midi.EndOfTrackEvent(tick=0))
    return pattern
    # if group[0] == 'blank':
    #   continue

    print("Group: ")
    empty = True
    for instrument in group:
        inum = instrument_num(instrument)

        # For normal instruments, play a couple of different notes.
        # For percussion instruments, play a couple of note on
        # the percussion channel.
        if inum <= 128:
            print("\t%s (%i)" % (instrument, inum))
            track.extend(
                [
                    midi.ProgramChangeEvent(tick=time, channel=0, data=[inum]),
                    midi.NoteOnEvent(
                        tick=0, channel=0, velocity=92, pitch=midi.A_3
                    ),
                    midi.NoteOffEvent(
                        tick=50, channel=0, velocity=92, pitch=midi.A_3
                    ),
                    midi.NoteOnEvent(
                        tick=0, channel=0, velocity=92, pitch=midi.B_3
                    ),
                    midi.NoteOffEvent(
                        tick=50, channel=0, velocity=92, pitch=midi.B_3
                    ),
                ]
            )
        else:
Example #7
0
 def select_patch(self, patch):
     if patch < 0 or patch >= BANK_SIZE:
         raise ArgumentError("Invalid Patch")
     self.seq.event_write(midi.ProgramChangeEvent(tick=0, channel=0, data=[patch]), False, False, True)
Example #8
0
import midi
pattern = midi.Pattern()
track = midi.Track()
pattern.append(track)

track.append(midi.ProgramChangeEvent(tick=0, channel=2, data=[5]))
track.append(midi.NoteOnEvent(tick=0, channel=2, data=[80, 127]))
track.append(midi.NoteOffEvent(tick=160, channel=2, data=[80, 127]))
track.append(midi.NoteOnEvent(tick=0, channel=2, data=[80, 127]))
track.append(midi.NoteOffEvent(tick=160, channel=2, data=[80, 127]))
track.append(midi.NoteOnEvent(tick=0, channel=2, data=[80, 127]))
track.append(midi.NoteOffEvent(tick=160, channel=2, data=[80, 127]))
track.append(midi.NoteOnEvent(tick=0, channel=2, data=[80, 127]))
track.append(midi.NoteOffEvent(tick=160, channel=2, data=[80, 127]))
eot = midi.EndOfTrackEvent(tick=1)
track.append(eot)
print(pattern)
midi.write_midifile("example.mid", pattern)
Example #9
0
"""
Created on Sun Sep 30 12:56:08 2018

@author: wrb
"""

import numpy as np
import midi
import time

melody=np.loadtxt('save_test.txt',dtype=np.int32)

# Recon
tone_set=[midi.TimeSignatureEvent(tick=0, data=[4, 2, 24, 8]),
                             midi.EndOfTrackEvent(tick=0, data=[])]
note_list=[midi.ProgramChangeEvent(tick=0, channel=0, data=[1])]
l=np.shape(melody)[0]
k=0
p=0
#ch=np.array([[48,52,55],[43,47,50],[45,48,52],[40,43,47],
#             [41,45,48],[36,40,43],[38,41,45],[43,47,50]])+12
ch=np.array([[48,52,55],[47,50,55],[48,52,57],[47,52,55],
             [48,53,57],[48,52,55],[50,53,57],[47,50,55]])
amp1=112
amp0=80
rhy=80
for i in range(l):
    if (i%8==0):
        a=(i//8)%8
        if (i>0):
            note_list.append(midi.NoteOffEvent(tick=rhy*(i-p), channel=0, data=[ch[a-1,0], 0]))
def main():
    line_re = r"(?P<timestamp>\d{2}:\d{2}:\d{2}.\d{6}) IP (?P<src>\d+\.\d+\.\d+\.\d+)\.(?P<sport>\d+) > (?P<dst>\d+\.\d+\.\d+\.\d+)\.(?P<dport>\d+): (?:Flags \[(?P<flags>[SFPRUWE\.]+)\])?.+?length (?P<length>\d+)"

    arg_parser = argparse.ArgumentParser(description="MIDI from tcpdump")
    arg_parser.add_argument('-f',
                            help="Output file, omit or give - for stdout",
                            metavar='file',
                            default='-')
    args = arg_parser.parse_args()

    if args.f == '-':
        output_file = sys.stdout
    else:
        output_file = open(args.f, 'w')

    pattern = midi.Pattern()
    track = midi.Track()
    pattern.append(track)
    track2 = midi.Track()
    pattern.append(track2)

    last_time = datetime.now()
    line = sys.stdin.readline()
    while line:
        match = re.match(line_re, line)
        if match:
            data = match.groupdict()

            # Get the difference between now and the last event
            now = datetime.strptime(data['timestamp'], '%H:%M:%S.%f')

            spacing = int((now - last_time).microseconds / 1000.0)
            last_time = now

            if spacing < MIN_SPACING:
                spacing = MIN_SPACING

            # Determine note length based on packet length
            pkt_length = int(data.get('length', 0))
            note_length = int(pow(pkt_length, 0.75))

            if note_length < MIN_LENGTH:
                note_length = MIN_LENGTH

            # determine the note to play based on TCP flags
            note = midi.C_3
            flags = data.get('flags', '')
            if flags:
                if 'S' in flags:
                    note = midi.D_3
                elif '.' in flags:
                    note = midi.C_3
                elif 'F' in flags:
                    note = midi.G_3
                elif 'R' in flags:
                    note = midi.F_3

            # Determine the octave based on the src and dst IPs
            octave = hash((data['src'], data['dst'])) % 6 + 2
            note = note + octave * 12

	    if note > MAX_OCTAVE:
		note  = MAX_OCTAVE

            # Finally, append the note to the track
            track.append(midi.NoteOnEvent(tick=0, velocity=70, pitch=note))
            track.append(midi.NoteOffEvent(tick=300, pitch=note))
	    track.append(midi.ProgramChangeEvent(data=[0]))

	    track2.append(midi.NoteOnEvent(tick=50, velocity=70, pitch=note))
            track2.append(midi.NoteOffEvent(tick=90, pitch=note))
	    track2.append(midi.ProgramChangeEvent(data=[19]))
	    


        line = sys.stdin.readline()

    # Dump MIDI track to stdout
    track.append(midi.EndOfTrackEvent(tick=1))
    track2.append(midi.EndOfTrackEvent(tick=1))
    midi.write_midifile(output_file, pattern)
    

    return 0
Example #11
0
 def set_instrument(self, time, instrument_number):
     #print(" %s set instrument at %s to %s" % (self.id, time, instrument_number))
     self.midi_data_track.append(
         midi.ProgramChangeEvent(channel=self.channel_number,
                                 tick=time,
                                 value=instrument_number))
Example #12
0
    def writemidi(self, filedir=""):
        # sorteer de events van abs ticks
        # gooit alle tracks en time signatures in track [0]

        # pak de track naam
        if self.texts[0][0].text != "":
            trackname = MIDI.TrackNameEvent(text=self.texts[0][0].text, tick=0)
            trackname.absoluteticks = 0
            # dunno werkt niet voor een of andere reden
            trackname.data = []
            i = 0
            while i < len(self.texts[0][0].text):
                trackname.data.append(ord(self.texts[0][0].text[i]))
                i += 1
            tracks = [[trackname]]
            del trackname  # verwijderd de naam als de hierboven genoteerde naam opnieuw wordt gebruikt
        else:
            tracks = [[]]
        # gooi alles in track [0]
        tracks[0] += self.texts[0][
            1:] + self.tempos + self.timesignatures + self.notes[0]
        # sorteer alles
        tracks[0].sort(key=operator.attrgetter('absoluteticks'))

        # pakt de instrument
        if self.channels[0] != 9 and self.instruments[0]:
            tracks[0].insert(
                0,
                MIDI.ProgramChangeEvent(value=self.instruments[0],
                                        channel=self.channels[0]))

        for i in range(1, len(self.notes)):
            # sorteer de tracks
            # pak de track naam
            if self.texts[i][0].text != "":
                trackname = MIDI.TrackNameEvent(text=self.texts[i][0].text,
                                                tick=0)
                # dunno dit werkt niet voor een of andere reden
                trackname.data = []
                trackname.absoluteticks = 0
                j = 0
                while j < len(self.texts[i][0].text):
                    trackname.data.append(ord(self.texts[i][0].text[j]))
                    j += 1
                tracks.append([trackname])
                del trackname  # verwijderd de naam als de hierboven genoteerde naam opnieuw wordt gebruikt
            else:
                tracks.append([])
            # pak de instrument
            tracks[i] += self.texts[i][1:] + self.notes[i]
            tracks[i].sort(key=operator.attrgetter('absoluteticks'))
            if self.channels[i] != 9 and self.instruments[i]:
                tracks[i].insert(
                    0,
                    MIDI.ProgramChangeEvent(value=self.instruments[i],
                                            channel=self.channels[i]))

        # kijk of de lokale ticks goed zijn
        tickdivisor = config.EDITresolution
        for i in range(len(tracks)):
            tracks[i].insert(
                0,
                MIDI.ControlChangeEvent(tick=0,
                                        channel=self.channels[i],
                                        data=[7, 127]))
        for track in tracks:
            previouseventabsoluteticks = 0
            for event in track:
                try:
                    thiseventabsoluteticks = int(event.absoluteticks)
                except AttributeError:
                    thiseventabsoluteticks = 0
                # aantal ticks in vergelijking tot voorgaande ticks en current ticks
                tickmeoff = thiseventabsoluteticks - previouseventabsoluteticks
                event.tick = tickmeoff
                # om te kijken hoe klein de resolutie is
                tickdivisor = gcd(tickdivisor, tickmeoff)
                # set de ticks voor de volgende event(midi)
                previouseventabsoluteticks = thiseventabsoluteticks

        if config.EDITresolution % tickdivisor:
            Error(
                " min RESOLUTON kan niet gedeeld worden door EDITresolution.  er is iets gaande "
            )

        newpattern = MIDI.Pattern(resolution=config.EDITresolution /
                                  tickdivisor)
        for track in tracks:
            if tickdivisor > 1:
                for event in track:
                    # deel de relatieve ticks
                    event.tick /= tickdivisor
                    # laat abs ticks in de edit resolution
            if track[-1].name != "End of Track":
                # voeg het einde van een track hier als het er niet is
                track.append(
                    MIDI.EndOfTrackEvent(tick=config.EDITresolution /
                                         tickdivisor))
            newpattern.append(MIDI.Track(track))

        if filedir == "":
            MIDI.write_midifile(self.midifile, newpattern)
        else:
            MIDI.write_midifile(filedir, newpattern)
Example #13
0
def roll_to_midi(rolls, tick_per_time_slice, resolution=120):
    # melody is index 0
    # guitar is index 1
    # piano is index 2
    # bass is index 3
    # drum is index 4

    result = midi.Pattern(resolution=resolution * 100)
    for i in range(5):
        if i >= len(rolls):
            continue

        roll = rolls[i]
        channel = i

        # for drum
        if channel == 4:
            channel = 9

        track = midi.Track()
        if i == 0:
            track.append(
                midi.ProgramChangeEvent(tick=0, data=[53], channel=channel))
        elif i == 1:
            track.append(
                midi.ProgramChangeEvent(tick=0, data=[29], channel=channel))
        elif i == 2:
            track.append(
                midi.ProgramChangeEvent(tick=0, data=[0], channel=channel))
        elif i == 3:
            track.append(
                midi.ProgramChangeEvent(tick=0, data=[34], channel=channel))
        else:
            track.append(
                midi.ProgramChangeEvent(tick=0, data=[1], channel=channel))

        current_tick = 0
        prev_intensity = [0 for _ in range(128)]
        prev_tick = 0

        for time_slice in range(roll.shape[1]):
            for pitch in range(roll.shape[0]):
                if roll[pitch][time_slice] != prev_intensity[pitch]:
                    diff_tick = current_tick - prev_tick
                    if roll[pitch][time_slice] == 0:
                        track.append(
                            midi.NoteOffEvent(
                                tick=diff_tick,
                                data=[pitch, prev_intensity[pitch]],
                                channel=channel))
                        prev_intensity[pitch] = 0
                        prev_tick = current_tick
                    else:
                        if prev_intensity[pitch] == 0:
                            track.append(
                                midi.NoteOnEvent(
                                    tick=diff_tick,
                                    data=[pitch, roll[pitch][time_slice]],
                                    channel=channel))
                            prev_intensity[pitch] = roll[pitch][time_slice]
                            prev_tick = current_tick
                        else:
                            track.append(
                                midi.NoteOffEvent(
                                    tick=diff_tick,
                                    data=[pitch, prev_intensity[pitch]],
                                    channel=channel))
                            track.append(
                                midi.NoteOnEvent(
                                    tick=diff_tick,
                                    data=[pitch, roll[pitch][time_slice]],
                                    channel=channel))
                            prev_intensity[pitch] = roll[pitch][time_slice]
                            prev_tick = current_tick
                current_tick += tick_per_time_slice

        track.append(midi.EndOfTrackEvent(tick=0, channel=channel))
        # if i == 1:
        result.append(track)
    return result
def main():
    line_re = r"(?P<timestamp>\d{2}:\d{2}:\d{2}.\d{6}) IP (?P<src>\d+\.\d+\.\d+\.\d+)\.(?P<sport>\d+) > (?P<dst>\d+\.\d+\.\d+\.\d+)\.(?P<dport>\d+): (?:Flags \[(?P<flags>[SFPRUWE\.]+)\])?.+?length (?P<length>\d+)"

    arg_parser = argparse.ArgumentParser(description="MIDI from tcpdump")
    arg_parser.add_argument('-f',
                            help="Output file, omit or give - for stdout",
                            metavar='file',
                            default='-')
    args = arg_parser.parse_args()

    if args.f == '-':
        output_file = sys.stdout
    else:
        output_file = open(args.f, 'w')
# To add track you can copy the first track (track = midi.Track() pattern.append(track)) an change the number behind.
    pattern = midi.Pattern()
    ###########################
    track = midi.Track()
    pattern.append(track)
    ###########################
    track2 = midi.Track()
    pattern.append(track2)
    track3 = midi.Track()
    pattern.append(track3)
    track4 = midi.Track()
    pattern.append(track4)
    track5 = midi.Track()
    pattern.append(track5)
    track6 = midi.Track()
    pattern.append(track6)
    track7 = midi.Track()
    pattern.append(track7)
    """track8 = midi.Track()
    pattern.append(track8)
    track9 = midi.Track()
    pattern.append(track9)
    track10 = midi.Track()
    pattern.append(track10)
    track11 = midi.Track()
    pattern.append(track11)
    track12 = midi.Track()
    pattern.append(track12)
    track13 = midi.Track()
    pattern.append(track13)
    track14 = midi.Track()
    pattern.append(track14)
    track15 = midi.Track()
    pattern.append(track15)"""

    last_time = datetime.now()
    line = sys.stdin.readline()
    while line:
        match = re.match(line_re, line)
        if match:
            data = match.groupdict()

            # Get the difference between now and the last event
            now = datetime.strptime(data['timestamp'], '%H:%M:%S.%f')

            spacing = int((now - last_time).microseconds / 1000.0)
            last_time = now

            if spacing < MIN_SPACING:
                spacing = MIN_SPACING

            # Determine note length based on packet length
            pkt_length = int(data.get('length', 0))
            note_length = int(pow(pkt_length, 0.75))

            if note_length < MIN_LENGTH:
                note_length = MIN_LENGTH

            # determine the note to play based on TCP flags
            note = midi.E_3  # Modifire midi.C_3 to midi.E_3
            flags = data.get('flags', '')
            if flags:  # You can change the note D C G F how do you want.
                if 'S' in flags:
                    note = midi.D_5
                elif '.' in flags:
                    note = midi.C_5
                elif 'F' in flags:
                    note = midi.G_5
                elif 'R' in flags:
                    note = midi.F_5

            # Determine the octave based on the src and dst IPs
            octave = hash((data['src'], data['dst'])) % 6 + 2
            note = note + octave * 5

            if note > MAX_OCTAVE:
                note = MAX_OCTAVE

            # Finally, append the note to the track, Velocity is between 0 and 127 also just copy the first 3 lines to add an track don't forget to change the number behind track.
            track.append(midi.NoteOnEvent(tick=800, velocity=127, pitch=50))
            track.append(midi.NoteOffEvent(tick=800, pitch=50))
            track.append(midi.ProgramChangeEvent(data=[115]))

            track2.append(
                midi.NoteOnEvent(tick=200, velocity=127, pitch=midi.C_3))
            track2.append(midi.NoteOffEvent(tick=200, pitch=midi.C_3))
            track2.append(midi.ProgramChangeEvent(data=[120]))

            track3.append(midi.NoteOnEvent(tick=400, velocity=50, pitch=note))
            track3.append(midi.NoteOffEvent(tick=400, pitch=note))
            track3.append(midi.ProgramChangeEvent(data=[0]))

            track4.append(midi.NoteOnEvent(tick=200, velocity=50, pitch=note))
            track4.append(midi.NoteOffEvent(tick=400, pitch=note))
            track4.append(midi.ProgramChangeEvent(data=[27]))

            track5.append(midi.NoteOnEvent(tick=400, velocity=100, pitch=note))
            track5.append(midi.NoteOffEvent(tick=800, pitch=note))
            track5.append(midi.ProgramChangeEvent(data=[53]))

            track6.append(midi.NoteOnEvent(tick=200, velocity=50, pitch=note))
            track6.append(midi.NoteOffEvent(tick=400, pitch=note))
            track6.append(midi.ProgramChangeEvent(data=[32]))

            track7.append(midi.NoteOnEvent(tick=0, velocity=75, pitch=note))
            track7.append(midi.NoteOffEvent(tick=100, pitch=note))
            track7.append(midi.ProgramChangeEvent(data=[72]))

#track8.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note))
#track8.append(midi.NoteOffEvent(tick=500, pitch=note))
#track8.append(midi.ProgramChangeEvent(data=[52]))

#track9.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note))
#track9.append(midi.NoteOffEvent(tick=500, pitch=note))
#track9.append(midi.ProgramChangeEvent(data=[52]))

#track10.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note))
#track10.append(midi.NoteOffEvent(tick=500, pitch=note))
#track10.append(midi.ProgramChangeEvent(data=[52]))

#track11.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note))
#track11.append(midi.NoteOffEvent(tick=500, pitch=note))
#track11.append(midi.ProgramChangeEvent(data=[52]))

#track12.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note))
#track12.append(midi.NoteOffEvent(tick=500, pitch=note))
#track12.append(midi.ProgramChangeEvent(data=[52]))

#track13.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note))
#track13.append(midi.NoteOffEvent(tick=500, pitch=note))
#track13.append(midi.ProgramChangeEvent(data=[52]))

#track14.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note))
#track14.append(midi.NoteOffEvent(tick=500, pitch=note))
#track14.append(midi.ProgramChangeEvent(data=[52]))

#track15.append(midi.NoteOnEvent(tick=0, velocity=100, pitch=note))
#track15.append(midi.NoteOffEvent(tick=500, pitch=note))
#track15.append(midi.ProgramChangeEvent(data=[52]))

        line = sys.stdin.readline()

    # Dump MIDI track to stdout add the track.append(midi.EndOfTrackEvent(tick=1)) and change the number behind the track to add a track
    track.append(midi.EndOfTrackEvent(tick=1))
    track2.append(midi.EndOfTrackEvent(tick=1))
    track3.append(midi.EndOfTrackEvent(tick=1))
    track4.append(midi.EndOfTrackEvent(tick=1))
    track5.append(midi.EndOfTrackEvent(tick=1))
    track6.append(midi.EndOfTrackEvent(tick=1))
    track7.append(midi.EndOfTrackEvent(tick=1))
    # track8.append(midi.EndOfTrackEvent(tick=1))
    # track9.append(midi.EndOfTrackEvent(tick=1))
    # track10.append(midi.EndOfTrackEvent(tick=1))
    # track11.append(midi.EndOfTrackEvent(tick=1))
    # track12.append(midi.EndOfTrackEvent(tick=1))
    # track13.append(midi.EndOfTrackEvent(tick=1))
    # track14.append(midi.EndOfTrackEvent(tick=1))
    # track15.append(midi.EndOfTrackEvent(tick=1))
    midi.write_midifile(output_file, pattern)

    return 0
Example #15
0
def process(input_path, output_path, resolution):
    output = midi.Pattern(resolution=resolution)
    print(resolution)

    melody_track = midi.Track()
    melody_track.append(midi.ProgramChangeEvent(tick=0, data=[53], channel=0))
    guitar_track = midi.Track()
    guitar_track.append(midi.ProgramChangeEvent(tick=0, data=[29], channel=1))
    piano_track = midi.Track()
    piano_track.append(midi.ProgramChangeEvent(tick=0, data=[0], channel=2))
    bass_track = midi.Track()
    bass_track.append(midi.ProgramChangeEvent(tick=0, data=[34], channel=3))
    drum_track = midi.Track()
    # drum_track.append(midi.TrackNameEvent(tick=0, text='tk10', data=[116, 107, 49, 48]))
    # drum_track.append(midi.PortEvent(tick=0, data=[0]))
    # drum_track.append(midi.ChannelPrefixEvent(tick=0, data=[9]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[0, 127]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[32, 0]))
    drum_track.append(midi.ProgramChangeEvent(tick=0, channel=9, data=[1]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[7, 110]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[11, 100]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[91, 34]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 29]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 28]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 47]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 121]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 24]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 47]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 60]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 24]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 45]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 64]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 24]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 43]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 63]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 28]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 40]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 53]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 28]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 57]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 84]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 24]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 42]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 60]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 24]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 46]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 59]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 24]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 49]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 59]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 28]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 49]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 19]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 28]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 51]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 95]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[99, 29]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[98, 55]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[6, 60]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[101, 127]))
    # drum_track.append(midi.ControlChangeEvent(tick=0, channel=9, data=[100, 127]))

    with open(input_path, 'r') as f:
        rdr = csv.reader(f)

        cur_tick = 0.0
        plus_tick_per_time_slice = 0.0205 * resolution
        print(plus_tick_per_time_slice)

        lines = 0
        for line in rdr:
            lines += 1
            ones = [i for i, x in enumerate(line) if x == '1']
            for i in ones:
                if 0 <= i < 128:
                    melody_track.append(
                        midi.NoteOnEvent(tick=0, data=[i, 70], channel=0))
                elif 128 <= i < 256:
                    melody_track.append(
                        midi.NoteOffEvent(tick=0, data=[i - 128, 0],
                                          channel=0))
                elif 0 <= i - 356 < 128:
                    guitar_track.append(
                        midi.NoteOnEvent(tick=0, data=[i - 356, 30],
                                         channel=1))
                elif 128 <= i - 356 < 256:
                    guitar_track.append(
                        midi.NoteOffEvent(tick=0,
                                          data=[i - 356 - 128, 0],
                                          channel=1))
                elif 0 <= i - 356 * 2 < 128:
                    piano_track.append(
                        midi.NoteOnEvent(tick=0,
                                         data=[i - 356 * 2, 30],
                                         channel=2))
                elif 128 <= i - 356 * 2 < 256:
                    piano_track.append(
                        midi.NoteOffEvent(tick=0,
                                          data=[i - 356 * 2 - 128, 0],
                                          channel=2))
                elif 0 <= i - 356 * 3 < 128:
                    bass_track.append(
                        midi.NoteOnEvent(tick=0,
                                         data=[i - 356 * 3, 30],
                                         channel=3))
                elif 128 <= i - 356 * 3 < 256:
                    bass_track.append(
                        midi.NoteOffEvent(tick=0,
                                          data=[i - 356 * 3 - 128, 0],
                                          channel=3))
                elif 0 <= i - 356 * 4 < 128:
                    drum_track.append(
                        midi.NoteOnEvent(tick=0,
                                         data=[i - 356 * 4, 30],
                                         channel=9))
                elif 128 <= i - 356 * 4 < 256:
                    drum_track.append(
                        midi.NoteOffEvent(tick=0,
                                          data=[i - 356 * 4 - 128, 0],
                                          channel=9))

            prev_tick = cur_tick
            cur_tick += plus_tick_per_time_slice
            plus_tick = int(cur_tick - prev_tick)

            melody_track[-1].tick += plus_tick
            guitar_track[-1].tick += plus_tick
            piano_track[-1].tick += plus_tick
            bass_track[-1].tick += plus_tick
            drum_track[-1].tick += plus_tick
        print(lines)
        print(cur_tick)

    melody_track.append(midi.EndOfTrackEvent(tick=0, channel=0))
    guitar_track.append(midi.EndOfTrackEvent(tick=0, channel=1))
    piano_track.append(midi.EndOfTrackEvent(tick=0, channel=2))
    bass_track.append(midi.EndOfTrackEvent(tick=0, channel=3))
    drum_track.append(midi.EndOfTrackEvent(tick=0, channel=9))

    output.append(melody_track)
    output.append(guitar_track)
    output.append(piano_track)
    output.append(bass_track)
    output.append(drum_track)

    midi.write_midifile(output_path, output)
Example #16
0
def write_midifile(melody, chords, pattern, filename):
    beat = 4

    def get_chord_pitches(chord):
        base = chord_base[chord[0]]
        if 'm' in chord:
            return (base, base + 3, base + 7)
        else:
            return (base, base + 4, base + 7)

    pattern = copy.deepcopy(pattern)
    del pattern[1]
    track_melody = midi.Track()
    pattern.append(track_melody)

    track_melody.append(midi.ProgramChangeEvent(tick=0, value=0, channel=0))
    track_melody.append(
        midi.TrackNameEvent(tick=0,
                            text='Track 1#',
                            data=[84, 114, 97, 99, 107, 32, 49]))

    pre_note = None
    for note in melody:
        if pre_note != None:
            tick = int(
                (note.position - pre_note.position) * pattern.resolution)
            track_melody.append(
                midi.NoteOffEvent(tick=tick, pitch=pre_note.pitch, channel=0))
        track_melody.append(
            midi.NoteOnEvent(tick=0, velocity=100, pitch=note.pitch,
                             channel=0))
        pre_note = note
    track_melody.append(
        midi.NoteOffEvent(tick=pattern.resolution * 1,
                          pitch=pre_note.pitch,
                          channel=0))
    track_melody.append(midi.EndOfTrackEvent(tick=0, channel=0))

    track_chord = midi.Track()
    pattern.append(track_chord)
    track_chord.append(midi.ProgramChangeEvent(tick=0, value=0, channel=1))
    track_chord.append(
        midi.TrackNameEvent(tick=0,
                            text='Track 2#',
                            data=[84, 114, 97, 99, 107, 32, 49],
                            channel=1))
    pre_chord = None
    for chord in chords:
        if pre_chord != None:
            tick = int((chord[0] - pre_chord[0]) * pattern.resolution)
            track_chord.append(
                midi.NoteOnEvent(tick=tick, velocity=0, pitch=0, channel=1))

            for pitch in get_chord_pitches(pre_chord[1]):
                track_chord.append(
                    midi.NoteOnEvent(tick=0,
                                     velocity=0,
                                     pitch=pitch,
                                     channel=1))

        for pitch in get_chord_pitches(chord[1]):
            track_chord.append(
                midi.NoteOnEvent(tick=0, velocity=80, pitch=pitch, channel=1))
        pre_chord = chord
    for i, pitch in enumerate(get_chord_pitches(pre_chord[1])):
        track_chord.append(
            midi.NoteOnEvent(tick=pattern.resolution * beat if i == 0 else 0,
                             velocity=0,
                             pitch=pitch,
                             channel=1))
    track_chord.append(midi.EndOfTrackEvent(tick=0, channel=1))

    midi.write_midifile(filename, pattern)