在Mathematica&中重叠音乐曲目MIDI踏板事件

时间:2011-11-06 21:21:01

标签: wolfram-mathematica midi

以下所有内容均指音乐/ MIDI(SoundNote个对象),而不是采样声音。

不幸的是,Mathematica似乎无法导入MIDI。我正在尝试为单个乐器文件(专注于钢琴)制作一个基于MIDI <-> CSV的简单MIDI导入器。

在Mathematica中叠加两个Sound对象的最简单方法是什么?

Show连接它们,它不会重叠。

一个不太简单的方法是将Sound反汇编为SoundNote,将每个SoundNote的时间规范转换为{Tstart, Tend}格式,然后将它们组合成一个新的声音。有一个简单的方法吗?

第二个问题:

有没有一种简单的方法来处理Mathematica中的踏板事件,同时仍然使用内部声音表示和MIDI播放器,而不是通过其他方式播放MIDI?

3 个答案:

答案 0 :(得分:7)

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. 触发事件以启动和停止记事
  4. 您选择重现声音的乐器完全取决于您的系统,并且可能在不同系统上以不同方式重现。现在,如果你想重现踏板效果,你必须编写一个功能,将其分解为与踏板的实际效果非常相似的单个MIDI事件。

    例如,您可以修改SoundNote或创建一个新功能,当传递选项Sustain -> t时,会延长t秒的注释。您可以将此更加切合实际,并将t秒划分为更小的细分,SoundVolume -> v作为附加选项,v与每个细分线性线性/对数递减。

答案 1 :(得分:2)

至于你的第二个问题:

早些时候reported关于Mathematica连接任天堂Wiimote和Balanceboard的能力,使用程序GlovePie和PPJoy,一个虚拟操纵杆驱动程序,让Mathematica通过模拟操纵杆与您的设备连接( MMA可以使用ControllerStateControllerInformation进行阅读。据我所知,GlovePie也支持MIDI。你可以尝试一下。

答案 2 :(得分:0)

您可以使用卷积组合或叠加声波,如本页上的Mathematica代码所示:

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