Wolfram mathematica 在Mathematica&;MIDI踏板事件

Wolfram mathematica 在Mathematica&;MIDI踏板事件,wolfram-mathematica,midi,Wolfram Mathematica,Midi,以下所有内容均指音乐/MIDI(SoundNoteobjects),而非采样声音 不幸的是,Mathematica似乎无法导入MIDI。我正在尝试制作一个简单的MIDI导入器,它基于单乐器文件(重点是钢琴) 在Mathematica中,叠加两个声音的最简单方法是什么? Show将它们连接起来,但不会重叠 一种不太简单的方法是将声音分解为声音注释s,将每个声音注释s的时间规格转换为{Tstart,倾向}格式,并将它们组合成新的声音。有简单的方法吗 第二个问题: 在Mathematica中,是否有一

以下所有内容均指音乐/MIDI(
SoundNote
objects),而非采样声音

不幸的是,Mathematica似乎无法导入MIDI。我正在尝试制作一个简单的MIDI导入器,它基于单乐器文件(重点是钢琴)

在Mathematica中,叠加两个
声音的最简单方法是什么?

Show
将它们连接起来,但不会重叠

一种不太简单的方法是将
声音
分解为
声音注释
s,将每个
声音注释
s的时间规格转换为
{Tstart,倾向}
格式,并将它们组合成新的声音。有简单的方法吗

第二个问题:

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

1。叠加 为了能够叠加两个
声音
对象,应该有一个共同的时间原点。一个简单的
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
    每段线性/对数递减。

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


    关于你的第二个问题:


    前面我介绍了Mathematica使用程序和虚拟操纵杆驱动程序PPJoy连接任天堂Wiimote和Balanceboard的能力,该驱动程序允许Mathematica通过模拟操纵杆(MMA可以使用
    ControllerState
    ControllerInformation
    )与您的设备进行交互。据我所知,GlovePie也支持MIDI。您可以试一试。

    OP已经明确表示,他谈论的是MIDI对象,而不是采样声音。你不能将MIDI对象与任何东西进行卷积…@yoda,但从某种意义上说,MIDI对象是声音的表示。因此,随着转换成声音,卷积可能是有效的。这只会使他的解决方案不完整。@rcollyer MIDI对象是一组指令。输出的呈现方式取决于系统。理论上,您可以将其转换为采样声音、卷积,然后返回到一组MIDI指令(如果结果甚至可以用MIDI表示)。但是MIDI文件并不是那么容易操作、采样和导出的,正如我在尝试提出解决方案时发现的那样。Mathematica的Mac版本通过ControllerState[]函数本机支持MIDI设备。不需要任何虚拟操纵杆驱动程序。@ragfield我想Windows不需要,对吧?当我将钢琴连接到计算机时,我从
    控制器信息[]
    中得到“未检测到控制器设备”。实际上,我正在寻找一种输出声音的方法,同时也考虑到持续踏板的影响(我现在只对钢琴式乐器感兴趣),但这在Mathematica中似乎不可能实现。GlovePie让我做的是使用外部MIDI键盘(可能还有踏板)控制Mathematica。@szabolcs正确,ControllerState中内置的MIDI支持仅限于Mac。@szabolcs我想这里可能存在计时问题。耳朵对声音产生的延迟非常敏感。这就是为什么音乐家总是使用ASIO驱动程序。在将MIDI数据传送给Mathematica(也不能保证实时处理)之前,通过两个程序路由MIDI数据在这个意义上可能远远不是最优的。谢谢!我也在想类似的事情,似乎没有更简单的办法了。关于踏板,它实际上是MIDI的一部分。在CSV表示中,踩下或松开踏板显示为
    Control_c,0,64,127
    ,这意味着将控制器64的值设置为127(踩下踏板)或0(松开踏板)。当然,这取决于所使用的MIDI乐器是否会对该事件起作用,但通常任何钢琴风格的乐器都应该响应它。我想我将使用我自己在Mathematica中的MIDI表示,并编写一个到
    声音
    对象和MIDI文件的转换器。使用
    声音
    对象,可以通过扩展每个音符直到踏板松开来模拟持续踏板。我很确定MIDI可以传输踏板信息。它通过CC#64传输,我只是不知道你要如何在Mathematica上实现它,另外,尤达对MIDI的评论非常不完整-尤达,你是指MID吗