Merging MidiWriterKotlin.kt
This commit is contained in:
parent
d50ebc7584
commit
cd41ea0b6a
3 changed files with 57 additions and 140 deletions
|
|
@ -1,62 +0,0 @@
|
||||||
package mg.dot.feufaro.midi
|
|
||||||
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import mg.dot.feufaro.FileRepository
|
|
||||||
|
|
||||||
actual class MidiWriterKotlin actual constructor(private val fileRepository: FileRepository) {
|
|
||||||
private val sequence = MidiSequence(60)
|
|
||||||
private val track = sequence.createTrack()
|
|
||||||
private var tick: Long = 0
|
|
||||||
private var nextTick: MutableList<MidiPitch> = mutableListOf()
|
|
||||||
private val lastPitch : MutableList<Int> = mutableListOf()
|
|
||||||
private val useChord : Boolean = true
|
|
||||||
actual fun addNote( voiceNumber: Int, note: Int, velocity: Int, tick: Long) {
|
|
||||||
val channel = (voiceNumber -1).coerceIn(0, 3)
|
|
||||||
var finalNote = note
|
|
||||||
|
|
||||||
if (voiceNumber == 3 || voiceNumber == 4) {
|
|
||||||
finalNote -= 12
|
|
||||||
}
|
|
||||||
if (lastPitch.size > voiceNumber && lastPitch[voiceNumber] > 0) {
|
|
||||||
sequence.addSequence(channel, lastPitch[voiceNumber], tick)
|
|
||||||
}
|
|
||||||
var finalVelocity = velocity
|
|
||||||
var midiNote = finalNote
|
|
||||||
if (finalNote <= 0) {
|
|
||||||
midiNote = 40
|
|
||||||
finalVelocity = 0
|
|
||||||
}
|
|
||||||
sequence.addSequence(channel, midiNote, tick, 90, finalVelocity)
|
|
||||||
|
|
||||||
while(lastPitch.size <= voiceNumber) {
|
|
||||||
lastPitch.add(0)
|
|
||||||
}
|
|
||||||
lastPitch[voiceNumber] = midiNote
|
|
||||||
}
|
|
||||||
actual fun save(filePath: String) {
|
|
||||||
val parseScope = CoroutineScope(Dispatchers.Default)
|
|
||||||
parseScope.launch {
|
|
||||||
sequence.write()
|
|
||||||
fileRepository.saveFile(filePath, sequence.out.toByteArray())
|
|
||||||
//val fout = fileRepository.getOutputStream(filePath)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
actual fun addMetaMessage(type: Int, tick: Int, nbData: Int, metaByteString: String) {
|
|
||||||
sequence.addMeta( type, tick, nbData, metaByteString)
|
|
||||||
}
|
|
||||||
actual fun process(pitches: List<MidiPitch>) {
|
|
||||||
val lastTick = 0
|
|
||||||
nextTick.clear()
|
|
||||||
// addMetaMessage(0x59, 4, 2, 2,0)
|
|
||||||
tick = 0
|
|
||||||
pitches.forEach {
|
|
||||||
if (it.metaType > 0) {
|
|
||||||
addMetaMessage(it.metaType, it.tick, it.metaByteSize, it.metaBytes)
|
|
||||||
} else if (it.pitch != "") {
|
|
||||||
addNote(it.voiceNumber, it.pitch.toInt(), 100, it.tick.toLong())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +1,62 @@
|
||||||
package mg.dot.feufaro.midi
|
package mg.dot.feufaro.midi
|
||||||
|
|
||||||
|
import kotlinx.coroutines.CoroutineScope
|
||||||
|
import kotlinx.coroutines.Dispatchers
|
||||||
|
import kotlinx.coroutines.launch
|
||||||
import mg.dot.feufaro.FileRepository
|
import mg.dot.feufaro.FileRepository
|
||||||
|
|
||||||
expect class MidiWriterKotlin(fileRepository: FileRepository) {
|
class MidiWriterKotlin constructor(private val fileRepository: FileRepository) {
|
||||||
fun addNote( voiceNumber: Int, note: Int, velocity: Int, tick: Long)
|
private val sequence = MidiSequence(60)
|
||||||
fun save(filePath: String)
|
private val track = sequence.createTrack()
|
||||||
fun addMetaMessage(type: Int, tick: Int, nbData: Int, metaByteString: String)
|
private var tick: Long = 0
|
||||||
fun process(pitches: List<MidiPitch>)
|
private var nextTick: MutableList<MidiPitch> = mutableListOf()
|
||||||
|
private val lastPitch : MutableList<Int> = mutableListOf()
|
||||||
|
private val useChord : Boolean = true
|
||||||
|
fun addNote( voiceNumber: Int, note: Int, velocity: Int, tick: Long) {
|
||||||
|
val channel = (voiceNumber -1).coerceIn(0, 3)
|
||||||
|
var finalNote = note
|
||||||
|
|
||||||
|
if (voiceNumber == 3 || voiceNumber == 4) {
|
||||||
|
finalNote -= 12
|
||||||
|
}
|
||||||
|
if (lastPitch.size > voiceNumber && lastPitch[voiceNumber] > 0) {
|
||||||
|
sequence.addSequence(channel, lastPitch[voiceNumber], tick)
|
||||||
|
}
|
||||||
|
var finalVelocity = velocity
|
||||||
|
var midiNote = finalNote
|
||||||
|
if (finalNote <= 0) {
|
||||||
|
midiNote = 40
|
||||||
|
finalVelocity = 0
|
||||||
|
}
|
||||||
|
sequence.addSequence(channel, midiNote, tick, 90, finalVelocity)
|
||||||
|
|
||||||
|
while(lastPitch.size <= voiceNumber) {
|
||||||
|
lastPitch.add(0)
|
||||||
|
}
|
||||||
|
lastPitch[voiceNumber] = midiNote
|
||||||
|
}
|
||||||
|
fun save(filePath: String) {
|
||||||
|
val parseScope = CoroutineScope(Dispatchers.Default)
|
||||||
|
parseScope.launch {
|
||||||
|
sequence.write()
|
||||||
|
fileRepository.saveFile(filePath, sequence.out.toByteArray())
|
||||||
|
//val fout = fileRepository.getOutputStream(filePath)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
fun addMetaMessage(type: Int, tick: Int, nbData: Int, metaByteString: String) {
|
||||||
|
sequence.addMeta( type, tick, nbData, metaByteString)
|
||||||
|
}
|
||||||
|
fun process(pitches: List<MidiPitch>) {
|
||||||
|
val lastTick = 0
|
||||||
|
nextTick.clear()
|
||||||
|
// addMetaMessage(0x59, 4, 2, 2,0)
|
||||||
|
tick = 0
|
||||||
|
pitches.forEach {
|
||||||
|
if (it.metaType > 0) {
|
||||||
|
addMetaMessage(it.metaType, it.tick, it.metaByteSize, it.metaBytes)
|
||||||
|
} else if (it.pitch != "") {
|
||||||
|
addNote(it.voiceNumber, it.pitch.toInt(), 100, it.tick.toLong())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -1,73 +0,0 @@
|
||||||
package mg.dot.feufaro.midi
|
|
||||||
|
|
||||||
import kotlinx.coroutines.CoroutineScope
|
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import mg.dot.feufaro.FileRepository
|
|
||||||
import javax.sound.midi.*
|
|
||||||
|
|
||||||
actual class MidiWriterKotlin actual constructor(private val fileRepository: FileRepository) {
|
|
||||||
private val sequence = Sequence(Sequence.PPQ, 60)
|
|
||||||
private val track = sequence.createTrack()
|
|
||||||
private var tick: Long = 0
|
|
||||||
private var nextTick: MutableList<MidiPitch> = mutableListOf()
|
|
||||||
private val noteOn = ShortMessage()
|
|
||||||
private val noteOff = ShortMessage()
|
|
||||||
private val lastPitch : MutableList<Int> = mutableListOf()
|
|
||||||
private val useChord : Boolean = true
|
|
||||||
actual fun addNote( voiceNumber: Int, note: Int, velocity: Int, tick: Long) {
|
|
||||||
val channel = (voiceNumber -1).coerceIn(0, 3)
|
|
||||||
var finalNote = note
|
|
||||||
|
|
||||||
if (voiceNumber == 3 || voiceNumber == 4) {
|
|
||||||
finalNote -= 12
|
|
||||||
}
|
|
||||||
if (lastPitch.size > voiceNumber && lastPitch[voiceNumber] > 0) {
|
|
||||||
val offMsg = ShortMessage()
|
|
||||||
offMsg.setMessage(ShortMessage.NOTE_OFF, channel, lastPitch[voiceNumber], 0)
|
|
||||||
track.add(MidiEvent(offMsg, tick))
|
|
||||||
}
|
|
||||||
var finalVelocity = velocity
|
|
||||||
var midiNote = finalNote
|
|
||||||
if (finalNote <= 0) {
|
|
||||||
midiNote = 40
|
|
||||||
finalVelocity = 0
|
|
||||||
}
|
|
||||||
val onMsg = ShortMessage()
|
|
||||||
onMsg.setMessage(ShortMessage.NOTE_ON, channel, midiNote, finalVelocity)
|
|
||||||
track.add(MidiEvent(onMsg, tick))
|
|
||||||
|
|
||||||
while(lastPitch.size <= voiceNumber) {
|
|
||||||
lastPitch.add(0)
|
|
||||||
}
|
|
||||||
lastPitch[voiceNumber] = midiNote
|
|
||||||
}
|
|
||||||
actual fun save(filePath: String) {
|
|
||||||
val parseScope = CoroutineScope(Dispatchers.Default)
|
|
||||||
parseScope.launch {
|
|
||||||
val midiFileName = fileRepository.getFileName(filePath)
|
|
||||||
val out = fileRepository.getOutputStream(midiFileName)
|
|
||||||
println("write to : $midiFileName ")
|
|
||||||
MidiSystem.write(sequence, 1, out)
|
|
||||||
out.close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
actual fun addMetaMessage(type: Int, tick: Int, nbData: Int, metaByteString: String) {
|
|
||||||
val byteArray = metaByteString.toByteArray()
|
|
||||||
val metaMessage = MetaMessage(type, byteArray, nbData)
|
|
||||||
track.add(MidiEvent(metaMessage, tick.toLong()))
|
|
||||||
}
|
|
||||||
actual fun process(pitches: List<MidiPitch>) {
|
|
||||||
val lastTick = 0
|
|
||||||
nextTick.clear()
|
|
||||||
// addMetaMessage(0x59, 4, 2, 2,0)
|
|
||||||
tick = 0
|
|
||||||
pitches.forEach {
|
|
||||||
if (it.metaType > 0) {
|
|
||||||
addMetaMessage(it.metaType, it.tick, it.metaByteSize, it.metaBytes)
|
|
||||||
} else if (it.pitch != "") {
|
|
||||||
addNote(it.voiceNumber, it.pitch.toInt(), 100, it.tick.toLong())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Loading…
Add table
Reference in a new issue