0

我正在尝试使用以下代码制作旋律。问题是试图让序列播放节奏数组中的节奏值。我基本上想弹奏音符,然后在指定时间内关闭速度并播放序列中的下一个音符。

任何帮助将不胜感激。

int playMidi()
{
 //pitch array with constants defined for pitch numbers: ex. C4 = 60
 int pitchArray[11] {C4, A5, E4, F3, D4, FS5, BF4, CS3, FS5, C3, DF4}; /

//velocity array with constants defined for velocity: ex. QN = 1, EN = 0.5
 int velocityArray[11] {FORTE, PIANISSIMO, MEZZO_FORTE, PIANISSIMO, FORTISSIMO,
 MEZZO_PIANO, PIANISSIMO, FORTE, MEZZO_PIANO,FORTE, FORTISSIMO};

//rhythm array with constants defined for rhythm values: ex.  = 110
double rhythmArray[11] {EN, SN, SN, EN, QN, EN, EN, EN, TSN,TSN, SN};


for(int i=0; i<11; i++)
{

    UInt32 noteOnCommand =  kMidiMessage_NoteOn << 4 | midiChannelInUse;


        std::cout<< "The current pitch is: " 
                 <<pitchArray[i]  << "The velocity is: " <<velocityArray[i]
                 << " and the rhythmic value is: "<<rhythmArray[i]<<  "\n";

        MusicDeviceMIDIEvent(synthUnit, 
                             noteOnCommand, 
                             pitchArray[i], 
                             velocityArray[i], 
                             0);

        // sleep for a second
        sleep(1);





}
 return 0;
}
4

2 回答 2

3

如果您只是想按顺序播放 MIDI 音符,那么使用内置的MusicPlayer可能会比尝试从头开始创建类似的功能取得更多进展。它是一个非常灵活的框架,使开发人员能够即时创建多个MusicTrackMusicSequence,更改音轨和音符属性,甚至保存一个 .mid 文件。端点可以是 midi 设备或使用 soundfonts 的 AUGraph。

于 2013-04-11T14:50:01.833 回答
0

我相信 MusicDeviceMIDIEvent 中的最后一个参数是样本中的时间偏移。因此,如果您的采样率为 44.1k,那么您每秒有 44,100 个样本。这意味着要间隔一秒播放两个连续的音符,您将调用此方法 4 次。首先是时间:0,然后是音符,然后是时间:44,100,然后是音符。

于 2014-01-21T19:29:09.830 回答