如何使MusicDevice.h中的MusicDeviceMIDIEvent响应音符持续时间?

时间:2013-04-10 10:34:40

标签: macos midi duration audio-player coremidi

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

非常感谢任何帮助。

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;
}

2 个答案:

答案 0 :(得分:3)

如果您只是想按顺序播放midi音符,那么使用内置的MusicPlayer可能比尝试从头开始创建类似的功能更有进步。它是一个非常灵活的框架,使开发人员可以动态创建多个MusicTracksMusicSequences,更改跟踪和注释属性,甚至可以保存.mid文件。端点可以是midi设备,也可以是使用soundfonts的AUGraph。

答案 1 :(得分:0)

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