Skip to content

Commit 7bb9319

Browse files
committed
Fixed MIDI generation
1 parent 1d7b13a commit 7bb9319

File tree

4 files changed

+17
-21
lines changed

4 files changed

+17
-21
lines changed

core/src/commonMain/kotlin/pl/lemanski/mikroSoundFont/io/midi/MidiFile.kt

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package pl.lemanski.mikroSoundFont.io.midi
22

33
import pl.lemanski.mikroSoundFont.midi.MidiMessage
4+
import pl.lemanski.mikroSoundFont.midi.MidiMetaMessage
45
import pl.lemanski.mikroSoundFont.midi.MidiTrack
56
import pl.lemanski.mikroSoundFont.midi.UnsupportedMidiMessage
67

@@ -28,14 +29,11 @@ data class MidiFile(
2829

2930
val millis = trackTicks * ticks2time
3031
msg.time = millis.toInt()
31-
// TODO
32-
33-
// if (msg is MidiMetaMessage.SetTempo) {
34-
// val tempo = msg.tempo
35-
// ticks2time = tempo / (1000.0 * division)
36-
// tempoTicks = trackTicks
37-
// tempoMsec = millis
38-
// }
32+
33+
if (msg is MidiMetaMessage.SetTempo) {
34+
val tempo = msg.tempo
35+
ticks2time = tempo / (1000.0 * division)
36+
}
3937

4038
allMessages.add(msg)
4139
}

core/src/commonMain/kotlin/pl/lemanski/mikroSoundFont/io/midi/message/read/MidiMetaMessageParser.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package pl.lemanski.mikroSoundFont.io.midi.message.read
22

33
import kotlinx.io.Buffer
4+
import kotlinx.io.readUByte
45
import pl.lemanski.mikroSoundFont.InvalidMidiDataException
56
import pl.lemanski.mikroSoundFont.io.midi.message.readVarLen
67
import pl.lemanski.mikroSoundFont.midi.MidiMessage
@@ -49,7 +50,7 @@ internal class MidiMetaMessageParser(
4950

5051
var tempoValue = 0
5152
repeat(dataSize) {
52-
tempoValue = tempoValue shl 8 or buffer.readByte().toInt()
53+
tempoValue = tempoValue shl 8 or buffer.readUByte().toInt()
5354
}
5455

5556
return MidiMetaMessage.SetTempo(
Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,12 @@
11
package pl.lemanski.mikroSoundFont.midi
22

33
import pl.lemanski.mikroSoundFont.SoundFont
4-
import pl.lemanski.mikroSoundFont.getLogger
54

65
class MidiSequencer(
76
private val soundFont: SoundFont,
87
private val sampleRate: Int,
98
) {
109
private val sampleBlockSize: Int = 512
11-
private val logger = getLogger()
12-
private var currentTime = 0L
1310
private val messages = mutableListOf<MidiMessage>()
1411

1512
fun loadMidiEvents(midiMessages: List<MidiMessage>) {
@@ -18,15 +15,15 @@ class MidiSequencer(
1815
}
1916

2017
fun generate(): FloatArray {
21-
var currentTime = 0.0
18+
var currentTime = 0
2219
var audioBuffer = FloatArray(0)
2320

24-
for (msg in messages) {
25-
msg.process()
26-
val targetTime = msg.time.toDouble()
21+
for (i in 0..<messages.size) {
22+
messages[i].process()
23+
val targetTime = messages.getOrNull(i + 1)?.time ?: currentTime
2724

28-
while (targetTime >= currentTime) {
29-
currentTime += sampleBlockSize * (1000.0 / sampleRate)
25+
while (targetTime > currentTime) {
26+
currentTime += (sampleBlockSize * (1000.0 / sampleRate)).toInt()
3027
audioBuffer += soundFont.renderFloat(sampleBlockSize, false)
3128
}
3229
}
@@ -36,10 +33,10 @@ class MidiSequencer(
3633

3734
private fun MidiMessage.process() = when (this) {
3835
is MidiVoiceMessage.NoteOff -> soundFont.channels[channel].noteOff(key)
39-
is MidiVoiceMessage.NoteOn -> soundFont.channels[channel].noteOn(key, velocity / 127.0f)
36+
is MidiVoiceMessage.NoteOn -> soundFont.channels[channel].noteOn(key, if (velocity == 0) 0f else 1f)
4037
is MidiVoiceMessage.PitchBend -> soundFont.channels[channel].setPitchWheel(pitchBend)
4138
is MidiVoiceMessage.ProgramChange -> soundFont.channels[channel].setPresetNumber(program, channel == 9)
4239
is MidiVoiceMessage.ControlChange -> soundFont.channels[channel].setMidiControl(control, controlValue)
43-
else -> { }
40+
else -> {}
4441
}
4542
}

core/src/commonTest/kotlin/pl/lemanski/mikroSoundFont/midi/MidiTest.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ class MidiTest {
1414

1515
@Test
1616
fun testMidi() {
17-
val midiFileBuffer = loadFile("$dir\\hbd.mid")
17+
val midiFileBuffer = loadFile("$dir\\under.mid")
1818
val midiFile = MidiFileParser(midiFileBuffer).parse()
1919
val messages = midiFile.getMessagesOverTime()
2020

0 commit comments

Comments
 (0)