конвертировать миди-трек в тон. js часть - PullRequest
0 голосов
/ 09 апреля 2020

Мне нужно воспроизвести мелодию из 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,
  };
}
...