在Mathematica和MIDI踏板事件中叠加音乐曲目

Sza*_*lcs 7 midi wolfram-mathematica

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

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

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

Show 连接它们,它不会叠加.

一个不太简单的方法是拆卸SoundSoundNoteS,每次转换SoundNote的时间规范成{Tstart, Tend}格式,并组装这些到一个新的声音.有一个简单的方法吗?

第二个问题:

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

abc*_*bcd 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])]]
Run Code Online (Sandbox Code Playgroud)

2.踏板效果

至于你的第二个问题,我认为你不能使用MIDI重现踏板效果.MIDI格式非常简单,实际上并不传输任何声音.它携带的所有信息都是

  1. 正在播放的音符(音高)
  2. 音符的持续时间(节奏)
  3. 触发事件以启动和停止记事

您选择重现声音的乐器完全取决于您的系统,并且可能在不同系统上以不同方式重现.现在,如果你想重现踏板效果,你必须编写一个功能,将其分解为与踏板的实际效果非常相似的单个MIDI事件.

例如,您可以修改SoundNote或创建一个新函数,在传递选项时Sustain -> t,会延长音符的t秒数.您可以使这更加真实,并将t秒数分成更小的段,SoundVolume -> v作为附加选项,并v与每个段线性/对数减少.