Sza*_*lcs 7 midi wolfram-mathematica
以下所有内容均指音乐/ MIDI(SoundNote对象),而非采样声音.
不幸的是,Mathematica似乎无法导入MIDI.我正在尝试为单个乐器文件(专注于钢琴)制作一个基于MIDI < - > CSV的简单MIDI导入器.
Sound在Mathematica中叠加两个对象的最简单方法是什么?
Show 连接它们,它不会叠加.
一个不太简单的方法是拆卸Sound成SoundNoteS,每次转换SoundNote的时间规范成{Tstart, Tend}格式,并组装这些到一个新的声音.有一个简单的方法吗?
第二个问题:
有没有一种简单的方法来处理Mathematica中的踏板事件,同时仍然使用内部声音表示和MIDI播放器,而不是通过其他方式播放MIDI?
为了能够叠加两个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])]]
Run Code Online (Sandbox Code Playgroud)
至于你的第二个问题,我认为你不能使用MIDI重现踏板效果.MIDI格式非常简单,实际上并不传输任何声音.它携带的所有信息都是
您选择重现声音的乐器完全取决于您的系统,并且可能在不同系统上以不同方式重现.现在,如果你想重现踏板效果,你必须编写一个功能,将其分解为与踏板的实际效果非常相似的单个MIDI事件.
例如,您可以修改SoundNote或创建一个新函数,在传递选项时Sustain -> t,会延长音符的t秒数.您可以使这更加真实,并将t秒数分成更小的段,SoundVolume -> v作为附加选项,并v与每个段线性/对数减少.