feat: added pitch bend support

This commit is contained in:
Xiaohan-Tian
2026-05-05 21:28:32 -07:00
parent 8f453f8f4c
commit 98cccf5c7a
28 changed files with 1704 additions and 507 deletions
+21
View File
@@ -22,6 +22,11 @@ export const pianoRollIndexToPitch = (index: number) => {
};
export const MIDI_EVENT_TICKS_PER_BEAT = 480;
export const MIDI_PITCH_BEND_MIN = 0;
export const MIDI_PITCH_BEND_CENTER = 8192;
export const MIDI_PITCH_BEND_MAX = 16383;
export const MIDI_PITCH_BEND_MIN_SIGNED = -8192;
export const MIDI_PITCH_BEND_MAX_SIGNED = 8191;
export const pitchToNoteName = (pitch: number) => {
const noteNames = ['C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#', 'A', 'A#', 'B'];
@@ -36,6 +41,22 @@ export const pitchToNoteNameString = (pitch: number) => {
return `${note}${octave}`;
};
export const clampMidiPitchBendValue = (value: number): number => (
Math.max(MIDI_PITCH_BEND_MIN, Math.min(MIDI_PITCH_BEND_MAX, Math.round(value)))
);
export const midiPitchBendToSignedValue = (value: number): number => (
clampMidiPitchBendValue(value) - MIDI_PITCH_BEND_CENTER
);
export const signedPitchBendToMidiValue = (value: number): number => (
clampMidiPitchBendValue(value + MIDI_PITCH_BEND_CENTER)
);
export const midiPitchBendToNormalized = (value: number): number => (
midiPitchBendToSignedValue(value) / MIDI_PITCH_BEND_CENTER
);
export const noteNameToPitch = (noteName: string): number => {
const noteMap: { [key: string]: number } = {
'C': 0, 'C#': 1, 'Cb': -1, 'D': 2, 'D#': 3, 'Db': 1, 'E': 4, 'E#': 5, 'Eb': 3,