Мне нужно воспроизвести мелодию из MIDI-файла, и она должна синхронизировать c с щелчком по контексту аудио транспорта?
Каков наилучший способ преобразования дорожки из MIDI-файла в тон? . js part?
Пока я пробовал это:
function convertNoteToTimeEventObject(note: Note): TimeEventObject {
return {
time: note.bars,
note: note.name,
dur: String(note.duration),
velocity: note.velocity,
};
}
... и затем ...
const midi = await Midi.fromUrl(`${path}myfile.mid`)
const track: Track = midi.tracks[0]
// convert notes to events
const events: TimeEventObject[] = track.notes.map(
convertNoteToTimeEventObject
)
// create part
const part: Part = new Part((time, event) => {
synth.triggerAttackRelease(event.note, event.dur!, time, event.velocity)
}, events).start(0)
const bpm = midi.header.tempos[0].bpm
Transport.bpm.value = bpm
}
Мой клик зацикливается на 1 такт с щелчками восьмой ноты:
export const fourFour = [
{ time: 0, note: 'A1', velocity: 1 },
{ time: '0:1', note: 'B1', velocity: 0.5 },
{ time: '0:2', note: 'B1', velocity: 0.5 },
{ time: '0:3', note: 'B1', velocity: 0.5 },
];
const sampler: Sampler = new Sampler(
{ A1: 'click_hi.ogg', B1: 'click_lo.ogg' },
() => {},
`${path}/audio/`,
).toMaster();
const defaultPattern: Part = new Part((time, event) => {
sampler.triggerAttack(event.note, time, event.velocity);
}, partNotes).start(0);
defaultPattern.loop = true;
defaultPattern.loopEnd = '1m';
Есть проблемы с этим преобразованием:
Ноты должны быть восьмыми, но при использовании time
ноты должны играть как 16-ые ноты. Поэтому вместо этого я попытался использовать свойство bars
вместо этого, поскольку его значения «относительно» сигнатуры времени и темпа (0, 0,125, 0,25, 0,375, 0,5, 0,625, 0,75, 0,875, 1 ...).
Другая проблема заключается в том, что остатки не включены в преобразованную дорожку. Обратите внимание, что я конвертирую дорожки notes
prop (список объектов заметок). Кажется, это не включает в себя паузы, но нет соответствующих rests
prop ...
Поэтому я хотел бы знать, как лучше всего конвертировать трек из файла MIDI в тон. js Часть?
---- РЕДАКТИРОВАТЬ ----
Теперь я понимаю, что остатки косвенно отмечаются при преобразовании из-за времени начала и продолжительности каждой ноты. Боже мой!
Я решил преобразование, написав функцию util, которая преобразует bars
в TransportTime
запись:
export function convertBarsToTransportTime(numBars: number): string {
const bars = Math.floor(numBars);
const q = (numBars % 1) * 4;
const quarters = Math.floor(q);
const s = (q % 1) * 4;
const sixteenths = Math.floor(s);
return `${bars}:${quarters}${sixteenths > 0 ? `:${sixteenths}` : ''}`;
}
И используя ее так:
function convertNoteToTimeEventObject(note: Note): TimeEventObject {
return {
time: convertBarsToTransportTime(note.bars),
note: note.name,
dur: String(note.duration),
velocity: note.velocity,
};
}