Change note's duration type from int to Fraction and enable + operator support for note and int

This commit is contained in:
2020-03-16 20:03:37 +01:00
parent eaf501f367
commit 5c0fe0daf3
9 changed files with 179 additions and 99 deletions

View File

@@ -5,6 +5,7 @@ import io.smnp.callable.function.FunctionDefinitionTool
import io.smnp.callable.signature.Signature.Companion.simple
import io.smnp.data.entity.Note
import io.smnp.data.enumeration.Pitch
import io.smnp.math.Fraction
import io.smnp.type.enumeration.DataType.*
import io.smnp.type.matcher.Matcher.Companion.ofType
import io.smnp.type.model.Value
@@ -18,7 +19,7 @@ class NoteConstructor : Function("Note") {
ofType(BOOL)
) body { _, (pitchString, octave, duration, dot) ->
val pitch = Pitch.parse((pitchString.value as String).toLowerCase())
val note = Note(pitch, octave.value as Int, duration.value as Int, dot.value as Boolean)
val note = Note(pitch, octave.value as Int, Fraction(1, duration.value as Int), dot.value as Boolean)
Value.note(note)
}
}

View File

@@ -7,6 +7,7 @@ import io.smnp.data.entity.Note
import io.smnp.data.enumeration.Pitch
import io.smnp.error.CustomException
import io.smnp.ext.midi.Midi
import io.smnp.math.Fraction
import io.smnp.type.enumeration.DataType.*
import io.smnp.type.matcher.Matcher.Companion.ofType
import io.smnp.type.matcher.Matcher.Companion.optional
@@ -33,8 +34,8 @@ class MidiHelpFunction : Function("midiHelp") {
) body { environment, args ->
val instrument = args[0].value as Int
val bpm = args.getOrNull(1)?.value as Int? ?: 120
val begin = args.getOrNull(2) ?: Value.note(Note(Pitch.C, 1, 4, false))
val end = args.getOrNull(3) ?: Value.note(Note(Pitch.H, 9, 4, false))
val begin = args.getOrNull(2) ?: Value.note(Note(Pitch.C, 1, Fraction(1, 4), false))
val end = args.getOrNull(3) ?: Value.note(Note(Pitch.H, 9, Fraction(1, 4), false))
val channel = args.getOrNull(4)?.value as Int? ?: 1
if(channel > 16) {

View File

@@ -13,7 +13,7 @@ class DefaultSequenceCompiler : SequenceCompiler() {
track: Track,
ppq: Int
): Long {
val noteDuration = ((if (item.dot) 1.5 else 1.0) * 4L * ppq / item.duration).toLong()
val noteDuration = (4L * ppq * item.duration.decimal).toLong()
val noteOffTick = noteOnTick + noteDuration
track.add(noteOn(item, channel, noteOnTick))
track.add(noteOff(item, channel, noteOffTick))

View File

@@ -13,7 +13,7 @@ class PpqSequenceCompiler : SequenceCompiler() {
track: Track,
ppq: Int
): Long {
val noteOffTick = noteOnTick + item.duration
val noteOffTick = noteOnTick + item.duration.denominator
track.add(noteOn(item, channel, noteOnTick))
track.add(noteOff(item, channel, noteOffTick))
return noteOffTick