以下所有内容均指音乐/ MIDI(SoundNote
个对象),而不是采样声音。
不幸的是,Mathematica似乎无法导入MIDI。我正在尝试为单个乐器文件(专注于钢琴)制作一个基于MIDI <-> CSV的简单MIDI导入器。
在Mathematica中叠加两个Sound
对象的最简单方法是什么?
Show
连接它们,它不会重叠。
一个不太简单的方法是将Sound
反汇编为SoundNote
,将每个SoundNote
的时间规范转换为{Tstart, Tend}
格式,然后将它们组合成一个新的声音。有一个简单的方法吗?
第二个问题:
有没有一种简单的方法来处理Mathematica中的踏板事件,同时仍然使用内部声音表示和MIDI播放器,而不是通过其他方式播放MIDI?
答案 0 :(得分:7)
为了能够叠加两个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])]]
关于你的第二个问题,我认为你不能用MIDI重现踏板效果。 MIDI格式非常简单,实际上并不传输任何声音。它携带的所有信息都是
您选择重现声音的乐器完全取决于您的系统,并且可能在不同系统上以不同方式重现。现在,如果你想重现踏板效果,你必须编写一个功能,将其分解为与踏板的实际效果非常相似的单个MIDI事件。
例如,您可以修改SoundNote
或创建一个新功能,当传递选项Sustain -> t
时,会延长t
秒的注释。您可以将此更加切合实际,并将t
秒划分为更小的细分,SoundVolume -> v
作为附加选项,v
与每个细分线性线性/对数递减。
答案 1 :(得分:2)
至于你的第二个问题:
早些时候reported关于Mathematica连接任天堂Wiimote和Balanceboard的能力,使用程序GlovePie和PPJoy,一个虚拟操纵杆驱动程序,让Mathematica通过模拟操纵杆与您的设备连接( MMA可以使用ControllerState
或ControllerInformation
进行阅读。据我所知,GlovePie也支持MIDI。你可以尝试一下。
答案 2 :(得分:0)
您可以使用卷积组合或叠加声波,如本页上的Mathematica代码所示: