开源MIDI项目

主页 | 新闻 | 论坛 | 文件 | 常见问题 | 链接 | 贡献者 | 作者

Japanese | English | Chinese


常见问题-对于用户

有没有音频对应的计划?

不。开源MIDI项目是MIDI专用。为了防止软件和库变得沉重复杂,没有编辑音频的功能。如果你要编辑音频,请是用音频编辑软件,如Audacity。如果你要在同一时间编辑MIDI和音频,请使用DAW,如Cubase或者Sonar等。

有没有VSTi对应的计划?

不。因为VSTi的规格不一样,再有,因为VSTi的输入输出系统跟MIDI的不太一样,所以没有VSTi对应的计划。此外,因为我喜欢用硬件合成器,我不需要支持VSTi。如果你要使用VSTi,请使用MIDIYoke或LoopBe1等MIDI Loop Back程序和VSTiHost。

有没有ubuntu等Linux对应的计划?

不。因为用Linux作曲的人很少,所以没有Linux对应的计划。

这些软件或库可用于商业用途?

是的,可以。但是,支持只有在论坛里有。此外,没有担保,作者不承担任何责任。另外,如果你改变并重新分发程序,许可证必须是LGPL或GPL,必须重新分发源代码。如果你发布到这些库动态链接的自己的程序(只用DLL),许可证可以不用是LGPL或GPL,但你不能违反“禁止反编译”的规定。

音质很坏。

MIDI没有音质定义。MIDI只给仪器发送演奏信息。也许,因为你使用廉价的合成器,如Microsoft GS Wavetable Synth,你听这样坏音质。如果你要好听的音质,你应该买一个硬件合成器。2015年现在,作为机架模块,Roland Integra7,作为与键盘合成器,KORG KROME已经发布了。虽然贵软件合成器(VSTi)也有好听的音质,你要启动电脑和软件合成器。而且,除非你强化电脑的性能,在同一时间多个声音不能出来。而且,电脑坏了的时候,或OS改变了的时候,你已经买了的软件合成器可能或不能使用下去不是清楚。或者你可以使用更好的合成器例如Bassmidi Coolsoft并挂载好的音色库

在WindowsXP上,我听一个MIDI很正常,但在Windows Vista / Windows7 / Windows8.1上,我听这个MIDI音色不对。

如果你用Windows内置的Microsoft GS Wavetable Synth,经常发生这个问题。原因是,因为指定的音色号码(CC#0的值,CC#32的值,程序改变的值)是不正确的。因此,用世界树你要修改错误的号码到GS定义的音色号码。在WindowsXP上,即使指定了错误的音色号码,因为代表音色出来了,这个问题偶然没发生了。在另一方面,如果是非Microsoft GS Wavetable Synth对应的MIDI数据(例如,是Roland SC-88Pro对应的MIDI数据),因为使用的仪器是不同的,你可能没法听到正确的音色。同样地,你要修改音色号码。

在MIDI输出设备列表框里,Microsoft GS Wavetable Synth不会出现。

在某些电脑,除非你连接立体声耳机或音箱,Microsoft GS Wavetable Synth不会出现。请连接它们,然后启动程序。

如果你买了电脑的时候Microsoft GS Wavetable Synth已经没有,也许制造的注册表设置是错误的。您可能会解决如下。要小心,如果你已经安装了其它的MIDI设备,它们可能会导致错误。要小心,编辑注册表是很危险的,没有任何担保。

1.如果32bitOS中,移动到[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersin\Drivers32]。如果64bitOS中,移动到[HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersin\Drivers32]。

2. 修正如下。

我修改了语言设置,然后并重新开始了,但语言并没有改变。

如果你把程序放在c:\Program Files或c:\Program Files(x86)或c:\windows文件夹里,因为Windows有用户帐户控制(UAC)功能,组态文件(*.ini)不能打开或保存。请把程序放在上述以外的文件夹里。此外,从退出应用程序,写着组态文件(*.ini)需要大约2秒。请大约2秒等后启动应用程序。

我不能保存或恢复设置内容好。

如果你把程序放在c:\Program Files或c:\Program Files(x86)或c:\windows文件夹里,因为Windows有用户帐户控制(UAC)功能,组态文件(*.ini)不能打开或保存。请把程序放在上述以外的文件夹里。此外,从退出应用程序,写着组态文件(*.ini)需要大约2秒。请大约2秒等后启动应用程序。

世界树:怎么转换轨道格式0/1?

请选择"文件(F)" - "属性(R)...",然后选择轨道格式,然后按OK。此外,世界树的默认轨道格式是格式1。

世界树:怎么转换基格式或分辨率?

请选择"文件(F)" - "属性(R)...",然后选择基格式和分辨率,然后按OK。此外,世界树的默认基格式是TPQN格式,默认分辨率是120(Ticks每四分音符)。

世界树:怎么插入或修改拍速度,拍子标记,调号标记?

在事件列表窗口上,请显示只第一轨道,请插入或修改拍速度事件,拍子标记事件,调号标记事件。你也可以插入在乐曲的中间。应当指出,如果你要间歇性改变拍速度,你也可以画拍子速度在钢琴卷帘窗口下部的图形区域上。此外,世界树的默认拍子速度是120,拍子标记是4/4,调号标记是0#大(C大调)。为了输入升号,请写"#", 降号,写小写的"B",大调,写"major",小调,写"minor"。拍标记事件和调标记事件只影响屏幕显示,一点儿不影响演奏,请注意。

你也可以插入,变更,删除这个事件,通过右键点击在轨道列表窗口或钢琴卷帘口或乐谱窗口的拍速度,拍标记,调标记显示区域上。

世界树:怎么选择钢琴以外的音色?

在轨道列表窗口的左区域上,这有CC#0, CC#32, 程序号码列,在这儿你可以选择钢琴以外的音色。如果你用Windows内置的Microsoft GS Wavetable Synth,默认音色选择是,在通道10以外,CC#=0, CC#32=0, 程序号码=0-Piano1,在通道10(鼓)是CC#=0, CC#32=0, 程序号码=0-Standard。

世界树:在乐曲的中途,怎么改变音色?

在事件列表窗口上,请手动插入CC#0(Bank Select MSB)和CC#32(Bank Select LSB)和程序变更。在轨道列表窗口上,你能指定只最初的音色。然而,在同一轨道上在乐曲的中途改变音色,除非有轨道数的限制等在特殊情况下,是不推荐的。

世界树:怎么选择GS以外的音色?

默认仪器定义是Microsoft GS Wavetable Synth。请在网上寻找你使用的仪器的Cakewalk仪器定义文件(*.ins),然后把这个文件放instrument夹里,然后选择 "设定(S)" - "MIDI设备和仪器...",选择你的设备和仪器。如果你没有找到仪器定义文件,你可以直接输入音色号码的数字,或者选择 "设定(S)" - "选项(O)...",清取消选中“探索只存在的音色”。

世界树:每个轨道的颜色,输出端口,输出ON/OFF等没保存在mid里。

在标准MIDI文件(*.mid)里,轨道属性不能保存。工作时,请保存为世界树序列文件(*.skj),然后发布时,请保存作为标准MIDI文件(*.mid)。如果MIDI数据使用两个或多个端口,即使输出端口设定了在轨道窗口上,你要嵌入每个轨道里端口前缀事件。每个文件格式的可保存的信息,请参考用户手册。世界树序列文件(*.skj)可以保存全信息。

世界树:我打开了标准MIDI文件,没改变任何东西就保存了,可是二进制文件内容是不同的。

世界树不改变基格式或分辨率,或追加,变更,删除事件。如果需要自动修改,消息框就出现。或许,因为省略或不省略运行状态节,数据内容是不同的。在标准MIDI文件中,如果一个事件的种类跟先前的事件的一样,可以省略这事件的运行状态节。

世界树:在文本・标记・歌词事件等,怎么描述Unicode字符串?

先,在字符串的前头描述"{@UTF-16LE}",其次描述下面的字符串。一旦描述字码,这就适用于后来的同一轨道上的同类的事件。字码会选择"{@latin}" "{@jp}" "{@UTF-16LE}" "{@UTF-16BE}"。如果你指定任何东西,原始就适用{@latin},可世界树就的适用在"设定"-"语言..."指定的文本编码。

对了、虽然世界树会使用Unicode,可是请小心Unicode不支持的或字码不支持的MIDI音序器或MIDI演奏器不会显示这个字符串。这是MIDI的拡张仕様(RP-026),原来支持只歌词。

世界树:我不能在乐谱窗口上输入#或b。

在音符输入的时或在音符拖移的时,如果你右键点击,#或b就添加。怎记号添加是于该位置的调标记自动确定的。

世界树:我不能在乐谱窗口上输入休止符。

因为MIDI数据没有休止符事件,这是规格。音符没有的位置就作为休止符工作。

世界树:我不能指定乐谱的外观或音符的外观。

因为MIDI数据没有外观信息,这是规格。

世界树:在演奏时,有时发生卡顿。

也许屏幕绘制负载很大。特别,页面切换的时,因为画了很多个文字和图像,经常发生卡顿。正式演奏时,你应该最小化世界树的全窗口,省得屏幕绘制,这样就不会发生卡顿。即使你使用高性能的显卡,它可能对3D绘图和DirectX有效,但是对GDI的2D绘图无效,如世界树。

而且,请注意MIDI事件的配置。你把多个事件不应该放在同一时刻上。尽可能分散放。特别,为了要初始化或设定,在最初的小节,多个事件拥挤,所以每个事件要确保一定的间隔。否则,一些音源可能接受不到一些MIDI消息。

世界树:我不能读取或保存VSQ文件好。

世界树不支持编辑VSQ文件。这个功能可能用调试VSQ文件。虽然VSQ文件的规格跟标准MIDI文件(*.MID)的规格一样,因为每个事件的规格跟标准MIDI文件(*.MID)事件的不一样,所以除非你作VSQ规格对应的确作的数据,它才正常运行。

MIDI选择器:一些MIDI设备往往不显示。

Windows不能识别该设备。对于USB设备,请再次试断开电缆。请试重新启动Windows。此外,尽管你用Windows Vista / Windows7不兼容的设备驱动程序,往往可能碰巧运行得好。另外,32位的设备驱动程序跟64位的不一样。请使用正确版本的设备驱动程序。

常见问题-对于开发人员

怎么载入Visual Studio Project work space(*.mdp)(*.sln)

2013年09月01号以前的软件或库,我用VisualC++ 4.0 Standard Edition制作了,所以你用VisualC++ 4.0 Standard Edition打开mdp文件。以后的软件或库,我用Visual C++ 2008 Standard Edition Service Pack 1制作了,所以你用Visual C++ 2008 Standard Edition Service Pack 1打开文件。可是,如果你不用变更或编译程序,且你要吃使用DLL,可以使用任何版本的Visual C++。

怎么使用动态链接库(DLL)在Microsoft Visual Studio上?

下面是Visual Studio上,MIDIIO库MIDIData库MIDIClock库MIDIStatus库MIDIInstrument库等DLL的用法。

1. 制作项目工作空间(Project Work Space)

2. 编译/链接 (案例MIDIData库)

怎么制作简单的MIDI演奏器?

下面是,简单的控制台程序的例。请参考。这个程序使用MIDIIO库、MIDIData库、MIDIClock库。

/* Simple Console MIDI Player example */

#include <stdio.h>
#include <tchar.h>
#include <windows.h>
#include "..\\MIDIIO\\MIDIIO.h"
#include "..\\MIDIData\\MIDIData.h"
#include "..\\MIDIClock\\MIDIClock.h"
/* Don't forget to add MIDIIO(d).lib to your project */
/* Don't forget to add MIDIData(d).lib to your project */
/* Don't forget to add MIDIClock(d).lib to your project */

int _tmain () {
  long lTimeMode = 0;
  long lTimeResolution = 0;
  long lTempo = 60000000 / 120; /* [microsec/quarter note] */
  long lEndTime = 0;
  long lOldTime = 0;
  long lCurTime = 0;
  MIDIOut* pMIDIOut = NULL;
  MIDIData* pMIDIData = NULL;
  MIDITrack* pMIDITrack = NULL;
  MIDIEvent* pMIDIEvent = NULL;
  MIDIClock* pMIDIClock = NULL;

  pMIDIOut = MIDIOut_Open (_T("Microsoft GS Wavetable Synth"));
  if (pMIDIOut == NULL) {
    _tprintf (_T("MIDIOut Open failed.\n"));
    return 0;
  }

  pMIDIData = MIDIData_LoadFromSMF (_T("test.mid"));
  if (pMIDIData == NULL) {
    _tprintf (_T("MIDIData Load failed.\n"));
    return 0;
  }

  lTimeMode = MIDIData_GetTimeMode (pMIDIData);
  lTimeResolution = MIDIData_GetTimeResolution (pMIDIData);
  lEndTime = MIDIData_GetEndTime (pMIDIData);

  pMIDIClock = MIDIClock_Create (lTimeMode, lTimeResolution, lTempo);
  if (pMIDIClock == NULL) {
    _tprintf (_T("MIDIClock_Create failed.\n"));
    return 0;
  }

  _tprintf (_T("Now playing...\n"));
  MIDIClock_Start (pMIDIClock);

  while (lCurTime <= lEndTime) {
    lCurTime = MIDIClock_GetTickCount (pMIDIClock);
    forEachTrack (pMIDIData, pMIDITrack) {
      forEachEvent (pMIDITrack, pMIDIEvent) {
        long lTime = MIDIEvent_GetTime (pMIDIEvent);
        if (lOldTime <= lTime && lTime < lCurTime) {
          if (MIDIEvent_IsTempo (pMIDIEvent)) {
            long lTempo = MIDIEvent_GetTempo (pMIDIEvent);
            MIDIClock_SetTempo (pMIDIClock, lTempo);
          }
          if (MIDIEvent_IsMIDIEvent (pMIDIEvent) ||
            MIDIEvent_IsSysExEvent (pMIDIEvent)) {
            unsigned char byMessage[256];
            long lLen = MIDIEvent_GetLen (pMIDIEvent);
            MIDIEvent_GetData (pMIDIEvent, byMessage, 256);
            MIDIOut_PutMIDIMessage (pMIDIOut, byMessage, lLen);
          }
        }
      }
    }
    lOldTime = lCurTime;
    Sleep (5);
  }
  MIDIClock_Stop (pMIDIClock);
  _tprintf (_T("Now end.\n"));

  MIDIClock_Delete (pMIDIClock);
  MIDIData_Delete (pMIDIData);
  MIDIOut_Close (pMIDIOut);
  return 1;
}
世界树/MIDI测试器/自动鼓编译/链接的时候,导致 "Not found MIDIData.h" 或 "MIDIData.lib" 或 "MIDIData.dll"

世界树?MIDI测试器?自动鼓 使用MIDIIO库?MIDIData库?MIDIClock库?MIDIStatus库?MIDIInstrument库,所以你要下载这些库,然后你要重命名如下所示,且你要放在如下所示的文件夹结构里面。


(C)2002-2017 kuzu / 开源MIDI项目 OSDN