package nl.astraeus.vst import kotlin.math.max import kotlin.math.min import kotlin.math.pow import kotlin.math.round /** * User: rnentjes * Date: 14-11-15 * Time: 11:50 */ enum class Note( val sharp: String, val flat: String ) { NONE("---", "---"), No02("C--","C--"), NO03("C#-","Db-"), NO04("D--","D--"), NO05("D#-","Eb-"), NO06("E--","E--"), NO07("F--","F--"), NO08("F#-","Gb-"), NO09("G--","G--"), NO10("G#-","Ab-"), NO11("A#-","Bb-"), NO12("B--","B--"), C0("C-0","C-0"), C0s("C#0","Db0"), D0("D-0","D-0"), D0s("D#0","Eb0"), E0("E-0","E-0"), F0("F-0","F-0"), F0s("F#0","Gb0"), G0("G-0","G-0"), G0s("G#0","Ab0"), A0("A-0","A-0"), A0s("A#0","Bb0"), B0("B-0","B-0"), C1("C-1","C-1"), C1s("C#1","Db1"), D1("D-1","D-1"), D1s("D#1","Eb1"), E1("E-1","E-1"), F1("F-1","F-1"), F1s("F#1","Gb1"), G1("G-1","G-1"), G1s("G#1","Ab1"), A1("A-1","A-1"), A1s("A#1","Bb1"), B1("B-1","B-1"), C2("C-2","C-2"), C2s("C#2","Db2"), D2("D-2","D-2"), D2s("D#2","Eb2"), E2("E-2","E-2"), F2("F-2","F-2"), F2s("F#2","Gb2"), G2("G-2","G-2"), G2s("G#2","Ab2"), A2("A-2","A-2"), A2s("A#2","Bb2"), B2("B-2","B-2"), C3("C-3","C-3"), C3s("C#3","Db3"), D3("D-3","D-3"), D3s("D#3","Eb3"), E3("E-3","E-3"), F3("F-3","F-3"), F3s("F#3","Gb3"), G3("G-3","G-3"), G3s("G#3","Ab3"), A3("A-3","A-3"), A3s("A#3","Bb3"), B3("B-3","B-3"), C4("C-4","C-4"), C4s("C#4","Db4"), D4("D-4","D-4"), D4s("D#4","Eb4"), E4("E-4","E-4"), F4("F-4","F-4"), F4s("F#4","Gb4"), G4("G-4","G-4"), G4s("G#4","Ab4"), A4("A-4","A-4"), A4s("A#4","Bb4"), B4("B-4","B-4"), C5("C-5","C-5"), C5s("C#5","Db5"), D5("D-5","D-5"), D5s("D#5","Eb5"), E5("E-5","E-5"), F5("F-5","F-5"), F5s("F#5","Gb5"), G5("G-5","G-5"), G5s("G#5","Ab5"), A5("A-5","A-5"), A5s("A#5","Bb5"), B5("B-5","B-5"), C6("C-6","C-6"), C6s("C#6","Db6"), D6("D-6","D-6"), D6s("D#6","Eb6"), E6("E-6","E-6"), F6("F-6","F-6"), F6s("F#6","Gb6"), G6("G-6","G-6"), G6s("G#6","Ab6"), A6("A-6","A-6"), A6s("A#6","Bb6"), B6("B-6","B-6"), C7("C-7","C-7"), C7s("C#7","Db7"), D7("D-7","D-7"), D7s("D#7","Eb7"), E7("E-7","E-7"), F7("F-7","F-7"), F7s("F#7","Gb7"), G7("G-7","G-7"), G7s("G#7","Ab7"), A7("A-7","A-7"), A7s("A#7","Bb7"), B7("B-7","B-7"), C8("C-8","C-8"), C8s("C#8","Db8"), D8("D-8","D-8"), D8s("D#8","Eb8"), E8("E-8","E-8"), F8("F-8","F-8"), F8s("F#8","Gb8"), G8("G-8","G-8"), G8s("G#8","Ab8"), A8("A-8","A-8"), A8s("A#8","Bb8"), B8("B-8","B-8"), C9("C-9","C-9"), C9s("C#9","Db9"), D9("D-9","D-9"), D9s("D#9","Eb9"), E9("E-9","E-9"), F9("F-9","F-9"), F9s("F#9","Gb9"), G9("G-9","G-9"), // out of midi range //G9s("G#9","Ab9"), //A9("A-9","A-9"), //A9s("A#9","Bb9"), //B9("B-9","B-9"), UP("^^^","^^^"), END("XXX","XXX"), ; // 69 = A4.ordinal val freq: Double = round(440.0 * 2.0.pow((ordinal - 69)/12.0) * 100.0) / 100.0 val cycleLength: Double = 1.0 / freq var sampleDelta: Double = 0.0 fun transpose(semiNotes: Int): Note = if (ordinal >= C0.ordinal && ordinal <= G9.ordinal) { var result = this.ordinal + semiNotes result = min(result, G9.ordinal) result = max(result, C0.ordinal) fromMidi(result) } else { this } companion object { fun fromMidi(midi: Int): Note { // todo: add check return entries[midi] } fun updateSampleRate(rate: Int) { println("Setting sample rate to $rate") for (note in Note.entries) { note.sampleDelta = (1.0 / rate.toDouble()) / note.cycleLength } } } } // freq = 10Hz // cycleLength = 0.1 // sampleRate = 48000 // sampleDelta = 4800 // (1.0 / freq) * sampleRate