mirror of
https://github.com/badvision/lawless-legends.git
synced 2025-03-01 03:30:04 +00:00
Better delta time tracking of MIDI events
This commit is contained in:
parent
2eb98cc548
commit
bf5fd4fafa
@ -5,13 +5,16 @@ import sys
|
||||
import mido
|
||||
|
||||
mid = mido.MidiFile(sys.argv[1])
|
||||
timescale = 16.0
|
||||
totaltime = 0
|
||||
perctime = 0
|
||||
eventtime = 0.0
|
||||
for msg in mid:
|
||||
eventtime += msg.time * timescale
|
||||
#print '; time = ', msg.time
|
||||
if msg.type == 'note_on' or msg.type == 'note_off':
|
||||
if msg.time > 0.0 and msg.time < 1.0/16.0:
|
||||
msg.time = 1.0/16.0
|
||||
deltatime = int(msg.time * 16)
|
||||
if eventtime > 0.0 and eventtime < 0.5:
|
||||
eventtime = 0.5
|
||||
deltatime = int(eventtime + 0.5)
|
||||
octave = int(msg.note / 12 - 1)
|
||||
onote = int(msg.note % 12)
|
||||
lrchan = int(msg.channel & 1)
|
||||
@ -23,16 +26,27 @@ for msg in mid:
|
||||
if octave < 0:
|
||||
octave = 0
|
||||
totaltime += deltatime
|
||||
if msg.channel == 9:
|
||||
if msg.channel == 9 or msg.channel == 8:
|
||||
#
|
||||
# Percussion
|
||||
#
|
||||
if vol > 0 and (totaltime - perctime) > 4:
|
||||
print '\t!BYTE\t${0:02X}, ${1:02X}, ${2:02X}\t; Percussion'.format(deltatime, msg.note >> 3, 2)
|
||||
perctime = totaltime
|
||||
if vol > 0:
|
||||
print '\t!BYTE\t${0:02X}, ${1:02X}, ${2:02X}\t; Percussion {3:d} Chan {4:d} Dur {5:d}'.format(deltatime, msg.note ^ 0x40, (lrchan << 7) | vol, msg.note, msg.channel, vol)
|
||||
eventtime = 0.0
|
||||
else:
|
||||
#
|
||||
# Note
|
||||
#
|
||||
print '\t!BYTE\t${0:02X}, ${1:02X}, ${2:02X}\t; Note {3:d} Chan {4:d} Vol {5:d}'.format(deltatime, 0x80 | (octave << 4) | onote, (lrchan << 7) | vol, msg.note, msg.channel, vol)
|
||||
print '\t!BYTE\t$00, $00, $00'
|
||||
eventtime = 0.0
|
||||
elif msg.type == 'set_tempo':
|
||||
pass
|
||||
timescale = msg.tempo / 500000.0 * 16.0
|
||||
print '; timescale = ', timescale
|
||||
elif msg.type == 'time_signature':
|
||||
pass
|
||||
elif msg.type == 'control_chage':
|
||||
pass
|
||||
elif msg.type == 'program_change':
|
||||
pass
|
||||
print '\t!BYTE\t${0:02X}, $00, $00'.format(int(eventtime + 0.5))
|
||||
|
@ -89,7 +89,7 @@ word[5] arpeggioDuration = DUR16TH, DUR16TH, DUR16TH/2, DUR16TH/3, DUR16TH/4
|
||||
// These are utility sequences/routines needed to test the music sequencer code.
|
||||
//
|
||||
asm toneTrack
|
||||
include "ultima3.seq"
|
||||
include "test.seq"
|
||||
end
|
||||
asm putc(ch)#0
|
||||
LDA ESTKL,X
|
||||
@ -477,17 +477,18 @@ def mbSequence(yield, func)#0
|
||||
//
|
||||
period = seqEvent->perchanvol
|
||||
if period
|
||||
psgWrite(mbVIA1, MIXER, $1C) // NG on C, Tone on B, A
|
||||
psgWrite(mbVIA1, CENVAMP, $10)
|
||||
psgWrite(mbVIA1, NGFREQ, note)
|
||||
psgWrite(mbVIA1, ENVPERIOD+1, period)
|
||||
psgWrite(mbVIA1, ENVSHAPE, $00) // Single decay
|
||||
if mbVIA2
|
||||
if (period & $80)
|
||||
psgWrite(mbVIA1, MIXER, $1C) // NG on C, Tone on B, A
|
||||
psgWrite(mbVIA1, CENVAMP, $10)
|
||||
psgWrite(mbVIA1, ENVSHAPE, (note >> 4) & $04)
|
||||
psgWrite(mbVIA1, NGFREQ, (note >> 1) & $1F)
|
||||
psgWrite(mbVIA1, ENVPERIOD+1, period & $7F)
|
||||
elsif mbVIA2
|
||||
psgWrite(mbVIA2, MIXER, $1C) // NG on C, Tone on B, A
|
||||
psgWrite(mbVIA2, CENVAMP, $10)
|
||||
psgWrite(mbVIA2, NGFREQ, note)
|
||||
psgWrite(mbVIA2, ENVSHAPE, (note >> 4) & $04)
|
||||
psgWrite(mbVIA2, NGFREQ, (note >> 1) & $1F)
|
||||
psgWrite(mbVIA2, ENVPERIOD+1, period)
|
||||
psgWrite(mbVIA2, ENVSHAPE, $00) // Single decay
|
||||
fin
|
||||
else
|
||||
if seqRepeat
|
||||
@ -662,7 +663,7 @@ def spkrSequence(yield, func)#0
|
||||
// Percussion event
|
||||
//
|
||||
if seqEvent->perchanvol
|
||||
spkrPWM($D000, 0, 64) // Play some random sample as percussion
|
||||
//spkrPWM($D000, 0, 64) // Play some random sample as percussion
|
||||
else
|
||||
if seqRepeat
|
||||
musicPlay(seqTrack, TRUE)
|
||||
|
Loading…
x
Reference in New Issue
Block a user