Наложение музыкальных композиций в Mathematica и MIDI - PullRequest
7 голосов
/ 07 ноября 2011

Все следующее относится к музыке / MIDI (SoundNote объектам), а не к сэмплированным звукам.

К сожалению, Mathematica, похоже, не может импортировать MIDI.Я пытаюсь сделать простой импортер MIDI на основе MIDI <-> CSV для файлов с одним инструментом (для фортепиано).

Какой самый простой способ наложениядва Sound объекта в Mathematica?

Show объединяют их, но не накладывают.

Не слишком простой подход - разобрать Sound в SoundNote s, преобразуйте каждую SoundNote s спецификацию времени в {Tstart, Tend} формат и соберите их в новый звук.Есть ли простой способ?

Второй вопрос:

Существует ли простой способ обработки событий педалей в Mathematica , при этом все еще используется внутреннее звуковое представление и MIDI-плеер, а не проигрывание MIDI каким-либо другим способом?

Ответы [ 3 ]

7 голосов
/ 07 ноября 2011

1.Суперпозиция

Чтобы иметь возможность накладывать два Sound объекта, должен быть общий источник времени.Простой SoundNote объект имеет свое собственное время начала и, следовательно, использование Sound в списке из них только объединит их и воспроизведет их последовательно.Вам придется использовать абсолютное время для каждого, чтобы наложить их.Таким образом, вы можете сочинять музыку MIDI с несколькими инструментами, играющими одновременно.

Вот краткий (не полированный) пример наложения.Басовые ноты играют на фортепиано, а высокие ноты - на кларнете.

tempo = 110;
eighthNoteDuration = 60/tempo/2;

trebleNotes = {"E5", "D#5", "E5", "D#5", "E5", "B", "D5", "C5", "A", 
   None, "C", "E", "A", "B", None, "E", "G#", "B", "C5", None, "E", 
   "E5", "D#5", "E5", "D#5", "E5", "B", "D5", "C5", "A", None, "C", 
   "E", "A", "B", None, "E", "C5", "B", "A"};
trebleNoteDurations = {1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1,
     1, 1, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1,
     1, 4} eighthNoteDuration;
trebleTimings = 
  Partition[
   Accumulate@Flatten@Transpose@{ConstantArray[0, Length@#], #} &@
    trebleNoteDurations, 2];

bassNotes = {None, None, "A2", "E3", "A3", None, None, "E3", "G#3", 
   "B3", None, None, "A2", "E3", "A3", None, None, None, "A2", "E3", 
   "A3", None, None, "E3", "G#3", "B3", None, None, "A2", "E3", "A3", 
   None};
bassNoteDurations = {2, 6, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1, 
    2, 6, 1, 1, 1, 1, 2, 1, 1, 1, 1, 2, 1, 1, 1, 1} eighthNoteDuration;
bassTimings = 
  Partition[
   Accumulate@Flatten@Transpose@{ConstantArray[0, Length@#], #} &@
    bassNoteDurations, 2];

Sound[Join[
  SoundNote[#1, #2, 
     "Piano"] & @@@ ({bassNotes, bassTimings}\[Transpose]), 
  SoundNote[#1, #2, 
     "Clarinet"] & @@@ ({trebleNotes, trebleTimings}\[Transpose])]]

2.Эффекты педали

Что касается вашего второго вопроса, я не думаю, что вы можете воспроизводить эффекты педали с помощью MIDI.Формат MIDI довольно прост и фактически не передает звук.Вся информация, которую он несет,

  1. воспроизводимая нота (высота)
  2. длительность ноты (темп)
  3. Запуск событий для запуска и остановки ноты

Инструмент, который вы выбираете для воспроизведения звука, полностью зависит от вашей системы и может воспроизводиться по-разному в разных системах.Теперь, если вы хотите воспроизвести эффект педали, вам нужно написать функцию, чтобы разбить ее на отдельные события MIDI, которые очень похожи на фактический эффект педали.

Например, вы можете изменить SoundNote или создать новую функцию, которая при передаче параметра Sustain -> t продлевает заметку на t секунд.Вы можете сделать это более реалистичным и разделить t секунд на более мелкие сегменты, с SoundVolume -> v в качестве дополнительной опции и v, линейно / логарифмически уменьшаясь с каждым сегментом.

2 голосов
/ 07 ноября 2011

По второму вопросу:

Ранее я сообщал о возможности Mathematica подключаться к Nintendo Wiimote и Balanceboard, используя программы GlovePie и PPJoy, виртуальный драйвер джойстика, который позволяет Mathematica взаимодействовать с вашим устройством путем симуляции джойстик (который MMA может прочитать, используя ControllerState или ControllerInformation). Насколько я знаю, GlovePie также поддерживает MIDI. Вы можете попробовать.

0 голосов
/ 07 ноября 2011

Вы можете комбинировать или накладывать звуковые волны, используя свертку, как показано кодом Mathematica на этой странице:

http://www.copperthoughts.com/projects/convolution/

...