Change note's duration type from int to Fraction and enable + operator support for note and int
This commit is contained in:
@@ -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)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user