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 довольно прост и фактически не передает звук.Вся информация, которую он несет,
- воспроизводимая нота (высота)
- длительность ноты (темп)
- Запуск событий для запуска и остановки ноты
Инструмент, который вы выбираете для воспроизведения звука, полностью зависит от вашей системы и может воспроизводиться по-разному в разных системах.Теперь, если вы хотите воспроизвести эффект педали, вам нужно написать функцию, чтобы разбить ее на отдельные события MIDI, которые очень похожи на фактический эффект педали.
Например, вы можете изменить SoundNote
или создать новую функцию, которая при передаче параметра Sustain -> t
продлевает заметку на t
секунд.Вы можете сделать это более реалистичным и разделить t
секунд на более мелкие сегменты, с SoundVolume -> v
в качестве дополнительной опции и v
, линейно / логарифмически уменьшаясь с каждым сегментом.