S
sreekant
Hi folks
I hope someone here might be able to help. I scavenged some info and
even code from the net and am trying to write a module that reads a text
file and spits out a midi file.
So far I managed to make it work to the level of reading a text file
with appropriate notes, octaves, transposing, volume, aftertouch,
polyphony, channeltouch etc.
However I am stuck at writing notes longer than 127 decimal number.
The code I am using is below. I didn't post the whole code to keep it
brief. If it is ok I will post the whole.
###########################################
def note_on(self, time, channel, note, velocity):
return varLen(time) + [0x90 + channel, note, velocity]
def varLen(value):
# Big endian variable byte word
# as defined by the midi standard
result = []
while value:
result.append((value & 0x7F) | 0x80)
value = value >> 7
if len(result) == 0:
return [0]
else:
result[len(result)-1] -= 128
result.reverse()
return result
#############################################
note_on should accept time,channel,note and velocity as decimals.
Note and velocity are not a problem as their numbers are small.
If I want to put a note that lasts say longer than 127, fluidsynth moans
saying unexpected eof or unexpected byte 0xfe.
What I would like to do is, to be able to
note_on(1500,1,60,120)
1500 being the problem.
Midi file standard says that time is written as a variable length
entity. so if 1500 does not fit in a byte it should then use as many
bytes as needed, but all bytes except last one have their msb set to 1
to show there is more to come.
Below is the output of mftext for a working and nonworking midi files
respectively.
############## playing a single 'a' note ############ working fine ###
Header format=1 ntrks=2 division=24
Track start
Time=0 Tempo, microseconds-per-MIDI-quarter-note=500000
Time=0 Time signature=4/4 MIDI-clocks/click=24
32nd-notes/24-MIDI-clocks=8
Time=0 Meta event, end of track
Track end
Track start
Time=0 Program, chan=1 program=1
Time=0 Note on, chan=1 pitch=57 vol=127
Time=127 Note off, chan=1 pitch=57 vol=0
Time=127 Meta event, end of track
Track end
######################################################
######### playing a single a note, with double the 127 duration##
########not working############################################
Header format=1 ntrks=2 division=24
Track start
Time=0 Tempo, microseconds-per-MIDI-quarter-note=500000
Time=0 Time signature=4/4 MIDI-clocks/click=24
32nd-notes/24-MIDI-clocks=8
Time=0 Meta event, end of track
Track end
Track start
Time=0 Program, chan=1 program=1
Time=0 Note on, chan=1 pitch=57 vol=127
Error: unexpected byte: 0xfe
#########################################################
What am I doing wrong!!!!!!
Help appreciated.
ta
sree
I hope someone here might be able to help. I scavenged some info and
even code from the net and am trying to write a module that reads a text
file and spits out a midi file.
So far I managed to make it work to the level of reading a text file
with appropriate notes, octaves, transposing, volume, aftertouch,
polyphony, channeltouch etc.
However I am stuck at writing notes longer than 127 decimal number.
The code I am using is below. I didn't post the whole code to keep it
brief. If it is ok I will post the whole.
###########################################
def note_on(self, time, channel, note, velocity):
return varLen(time) + [0x90 + channel, note, velocity]
def varLen(value):
# Big endian variable byte word
# as defined by the midi standard
result = []
while value:
result.append((value & 0x7F) | 0x80)
value = value >> 7
if len(result) == 0:
return [0]
else:
result[len(result)-1] -= 128
result.reverse()
return result
#############################################
note_on should accept time,channel,note and velocity as decimals.
Note and velocity are not a problem as their numbers are small.
If I want to put a note that lasts say longer than 127, fluidsynth moans
saying unexpected eof or unexpected byte 0xfe.
What I would like to do is, to be able to
note_on(1500,1,60,120)
1500 being the problem.
Midi file standard says that time is written as a variable length
entity. so if 1500 does not fit in a byte it should then use as many
bytes as needed, but all bytes except last one have their msb set to 1
to show there is more to come.
Below is the output of mftext for a working and nonworking midi files
respectively.
############## playing a single 'a' note ############ working fine ###
Header format=1 ntrks=2 division=24
Track start
Time=0 Tempo, microseconds-per-MIDI-quarter-note=500000
Time=0 Time signature=4/4 MIDI-clocks/click=24
32nd-notes/24-MIDI-clocks=8
Time=0 Meta event, end of track
Track end
Track start
Time=0 Program, chan=1 program=1
Time=0 Note on, chan=1 pitch=57 vol=127
Time=127 Note off, chan=1 pitch=57 vol=0
Time=127 Meta event, end of track
Track end
######################################################
######### playing a single a note, with double the 127 duration##
########not working############################################
Header format=1 ntrks=2 division=24
Track start
Time=0 Tempo, microseconds-per-MIDI-quarter-note=500000
Time=0 Time signature=4/4 MIDI-clocks/click=24
32nd-notes/24-MIDI-clocks=8
Time=0 Meta event, end of track
Track end
Track start
Time=0 Program, chan=1 program=1
Time=0 Note on, chan=1 pitch=57 vol=127
Error: unexpected byte: 0xfe
#########################################################
What am I doing wrong!!!!!!
Help appreciated.
ta
sree