Skip to content

Commit 1d7b13a

Browse files
committed
Rewrited IO methods to kotlinx io
1 parent 9bdce5a commit 1d7b13a

File tree

13 files changed

+83
-232
lines changed

13 files changed

+83
-232
lines changed

core/src/androidMain/kotlin/pl/lemanski/mikroSoundFont/io/File.android.kt

Lines changed: 0 additions & 25 deletions
This file was deleted.

core/src/androidMain/kotlin/pl/lemanski/mikroSoundFont/io/wav/WavFileHeader.android.kt

Lines changed: 0 additions & 58 deletions
This file was deleted.

core/src/commonMain/kotlin/pl/lemanski/mikroSoundFont/io/ByteArrayUtils.kt

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

3-
import kotlin.experimental.and
4-
53
/**
64
* Convert byte array to float array with little endian order
75
*/
@@ -42,19 +40,4 @@ fun FloatArray.toByteArrayBigEndian(): ByteArray {
4240
byteArray[i * Float.SIZE_BYTES + 3] = (intBits and 0xFF).toByte()
4341
}
4442
return byteArray
45-
}
46-
47-
48-
fun ByteArray.readShortAt(index: Int): Short {
49-
val shortBuffer = this.copyOfRange(index, index + 2).map { it.toInt() and 0xFF }
50-
return (shortBuffer[1] or (shortBuffer[0] shl 8)).toShort()
51-
}
52-
53-
fun ByteArray.readIntAt(index: Int): Int {
54-
val intBuffer = this.copyOfRange(index, index + 4).map { it.toInt() and 0xFF }
55-
return intBuffer[3] or (intBuffer[2] shl 8) or (intBuffer[1] shl 16) or (intBuffer[0] shl 24)
56-
}
57-
58-
fun ByteArray.readByteAt(index: Int): Byte {
59-
return this[index] and 0xFF.toByte()
6043
}
Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,24 @@
11
package pl.lemanski.mikroSoundFont.io
22

3-
expect fun loadFile(path: String): ByteArray
3+
import kotlinx.io.buffered
4+
import kotlinx.io.files.Path
5+
import kotlinx.io.files.SystemFileSystem
6+
import kotlinx.io.readByteArray
47

5-
expect fun saveFile(byteArray: ByteArray, path: String)
8+
fun loadFile(path: String): ByteArray {
9+
if (!SystemFileSystem.exists(Path(path))) {
10+
return byteArrayOf()
11+
}
12+
13+
return SystemFileSystem.source(Path(path)).buffered().readByteArray()
14+
}
15+
16+
fun saveFile(byteArray: ByteArray, path: String) {
17+
val p = Path(path)
18+
19+
if (!SystemFileSystem.exists(p)) {
20+
SystemFileSystem.createDirectories(p)
21+
}
22+
23+
SystemFileSystem.sink(p).buffered().write(byteArray)
24+
}

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

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

33
import pl.lemanski.mikroSoundFont.midi.MidiMessage
4-
import pl.lemanski.mikroSoundFont.midi.MidiMetaMessage
54
import pl.lemanski.mikroSoundFont.midi.MidiTrack
65
import pl.lemanski.mikroSoundFont.midi.UnsupportedMidiMessage
76

@@ -17,8 +16,6 @@ data class MidiFile(
1716
fun getMessagesOverTime(): List<MidiMessage> {
1817
val division = header.division
1918
var ticks2time = 500000 / (1000.0 * division)
20-
var tempoTicks = 0 // Tick count at the last tempo change
21-
var tempoMsec = 0 // Milliseconds at the last tempo change
2219

2320
val allMessages = mutableListOf<MidiMessage>()
2421

@@ -29,15 +26,16 @@ data class MidiFile(
2926
if (msg is UnsupportedMidiMessage) continue
3027
trackTicks += msg.time
3128

32-
val millis = tempoMsec + ((trackTicks - tempoTicks) * ticks2time).toInt()
33-
msg.time = millis
29+
val millis = trackTicks * ticks2time
30+
msg.time = millis.toInt()
31+
// TODO
3432

35-
if (msg is MidiMetaMessage.SetTempo) {
36-
val tempo = msg.tempo
37-
ticks2time = tempo / (1000.0 * division)
38-
tempoTicks = trackTicks
39-
tempoMsec = millis
40-
}
33+
// if (msg is MidiMetaMessage.SetTempo) {
34+
// val tempo = msg.tempo
35+
// ticks2time = tempo / (1000.0 * division)
36+
// tempoTicks = trackTicks
37+
// tempoMsec = millis
38+
// }
4139

4240
allMessages.add(msg)
4341
}

core/src/commonMain/kotlin/pl/lemanski/mikroSoundFont/io/wav/WavFileHeader.kt

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,10 @@
11
package pl.lemanski.mikroSoundFont.io.wav
22

3+
import kotlinx.io.Buffer
4+
import kotlinx.io.readByteArray
5+
import kotlinx.io.writeIntLe
6+
import kotlinx.io.writeShortLe
7+
38
data class WavFileHeader(
49
val chunkID: String = "RIFF",
510
val chunkSize: UInt,
@@ -29,4 +34,21 @@ data class WavFileHeader(
2934
}
3035
}
3136

32-
expect fun WavFileHeader.toByteArray(): ByteArray
37+
fun WavFileHeader.toByteArray(): ByteArray {
38+
return Buffer()
39+
.apply {
40+
write(chunkID.encodeToByteArray(), 0, 4)
41+
writeIntLe(chunkSize.toInt())
42+
write(format.encodeToByteArray(), 0, 4)
43+
write(subchunk1ID.encodeToByteArray(), 0, 4)
44+
writeIntLe(subchunk1Size.toInt())
45+
writeShortLe(audioFormat.toShort())
46+
writeShortLe(numChannels.toShort())
47+
writeIntLe(sampleRate.toInt())
48+
writeIntLe(byteRate.toInt())
49+
writeShortLe(blockAlign.toShort())
50+
writeShortLe(bitsPerSample.toShort())
51+
write(subchunk2ID.encodeToByteArray(), 0, 4)
52+
writeIntLe(subchunk2Size.toInt())
53+
}.readByteArray()
54+
}

core/src/commonMain/kotlin/pl/lemanski/mikroSoundFont/midi/MidiSequencer.kt

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -6,28 +6,24 @@ import pl.lemanski.mikroSoundFont.getLogger
66
class MidiSequencer(
77
private val soundFont: SoundFont,
88
private val sampleRate: Int,
9-
private val sampleBlockSize: Int
109
) {
10+
private val sampleBlockSize: Int = 512
1111
private val logger = getLogger()
1212
private var currentTime = 0L
13-
private val events = mutableListOf<MidiMessage>()
13+
private val messages = mutableListOf<MidiMessage>()
1414

15-
fun loadMidiEvents(midiEvents: List<MidiMessage>) {
16-
events.clear()
17-
events.addAll(midiEvents)
15+
fun loadMidiEvents(midiMessages: List<MidiMessage>) {
16+
messages.clear()
17+
messages.addAll(midiMessages)
1818
}
1919

2020
fun generate(): FloatArray {
2121
var currentTime = 0.0
2222
var audioBuffer = FloatArray(0)
23-
val i = events.iterator()
24-
var message: MidiMessage? = if (i.hasNext()) i.next() else return floatArrayOf()
2523

26-
while (i.hasNext()) {
27-
message?.process()
28-
message = i.next()
29-
30-
val targetTime = message.time.toDouble()
24+
for (msg in messages) {
25+
msg.process()
26+
val targetTime = msg.time.toDouble()
3127

3228
while (targetTime >= currentTime) {
3329
currentTime += sampleBlockSize * (1000.0 / sampleRate)
@@ -39,8 +35,11 @@ class MidiSequencer(
3935
}
4036

4137
private fun MidiMessage.process() = when (this) {
42-
is MidiVoiceMessage.NoteOff -> soundFont.noteOff(channel, key)
43-
is MidiVoiceMessage.NoteOn -> soundFont.noteOn(channel, key, velocity / 127.0f)
44-
else -> logger.log("Unknown message type")
38+
is MidiVoiceMessage.NoteOff -> soundFont.channels[channel].noteOff(key)
39+
is MidiVoiceMessage.NoteOn -> soundFont.channels[channel].noteOn(key, velocity / 127.0f)
40+
is MidiVoiceMessage.PitchBend -> soundFont.channels[channel].setPitchWheel(pitchBend)
41+
is MidiVoiceMessage.ProgramChange -> soundFont.channels[channel].setPresetNumber(program, channel == 9)
42+
is MidiVoiceMessage.ControlChange -> soundFont.channels[channel].setMidiControl(control, controlValue)
43+
else -> { }
4544
}
4645
}

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

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,16 @@ class MidiTest {
1414

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

2121
val soundFont = MikroSoundFont.load("$dir\\font.sf2")
2222

23-
val sequencer = MidiSequencer(soundFont, 44100, 512)
23+
val sequencer = MidiSequencer(soundFont, 44_100)
2424
sequencer.loadMidiEvents(messages)
2525
val wavBytes = sequencer.generate()
26+
println(wavBytes.size)
2627

2728
val wavHeader = WavFileHeader.write(44_100u, wavBytes.size.toUInt(), 2u)
2829
val file = wavHeader.toByteArray() + wavBytes.toByteArrayLittleEndian()

core/src/nativeMain/kotlin/pl/lemanski/mikroSoundFont/MikroSoundFontLogger.native.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,6 @@ package pl.lemanski.mikroSoundFont
22

33
actual fun getLogger(): MikroSoundFontLogger = object : MikroSoundFontLogger {
44
override fun log(message: String) {
5-
println("message")
5+
println(message)
66
}
77
}

core/src/nativeMain/kotlin/pl/lemanski/mikroSoundFont/io/File.native.kt

Lines changed: 0 additions & 46 deletions
This file was deleted.

0 commit comments

Comments
 (0)