0

以下は、ラベルに表示したいnotetypeとnotenumberを取得しているcメソッドです。実際には、midi ファイルのデータを返すメソッドの下で midi ファイルを再生していますが、clang メソッドで再生していますが、ラベルに表示したいと考えています。

static void MyMIDIReadProc(const MIDIPacketList *pktlist,
                           void *refCon,
                           void *connRefCon) {


    AudioUnit *player = (AudioUnit*) refCon;

    MIDIPacket *packet = (MIDIPacket *)pktlist->packet;
    for (int i=0; i < pktlist->numPackets; i++) {
        Byte midiStatus = packet->data[0];
        Byte midiCommand = midiStatus >> 4;


        if (midiCommand == 0x09) {
            Byte note = packet->data[1] & 0x7F;
            Byte velocity = packet->data[2] & 0x7F;

            int noteNumber = ((int) note) % 12;

            NSString *noteType;
            switch (noteNumber) {

                case 0:
                    noteType = @"C";
                    break;
                case 1:
                    noteType = @"C#";
                    break;
                case 2:
                    noteType = @"D";
                    break;
                case 3:
                    noteType = @"D#";
                    break;
                case 4:
                    noteType = @"E";
                    break;
                case 5:
                    noteType = @"F";
                    break;
                case 6:
                    noteType = @"F#";
                    break;
                case 7:
                    noteType = @"G";
                    break;
                case 8:
                    noteType = @"G#";
                    break;
                case 9:
                    noteType = @"A";
                    break;
                case 10:
                    noteType = @"Bb";
                    break;
                case 11:
                    noteType = @"B";
                    break;
                default:
                    break;
            }

            NSLog(@"noteType : noteNumber %@",[noteType stringByAppendingFormat:[NSString stringWithFormat:@": %i", noteNumber]]);
            ViewController* audio = (__bridge ViewController*)refCon;
            [audio.self.noteDisplayLabel setText:@"sdasd"];
           audio.test_messages = @"sdsadsa";
            [audio labelText:@"asdasdas"];
            NSLog(@"%@", audio.test_messages);
            OSStatus result = noErr;
          //    result = MusicDeviceMIDIEvent (player, midiStatus, note, velocity, 0);
        }
        packet = MIDIPacketNext(packet);
    }
}
4

2 に答える 2

0

NSLog メッセージは機能していますか? あたかもそうあるべきかのように見えます。

これはリアルタイムのコールバックであり、この場所で UI への書き込みに時間を費やしたくないため、MIDI Read Proc からビューを設定することはお勧めできません (問題が発生する可能性もあります)。

イベントをどこかに (配列のように) プッシュし、終了関数で (配列オブジェクトを使用して) ビュー コントローラーに通知を送信するとよいでしょう。この関数からすぐに戻りたい。

于 2013-03-07T08:09:40.413 に答える
0

私もこのコードを使用し、NSNotification を使用してラベルにメモを表示するように調整しました。

static NSString* kNAMIDINoteOnNotification = @"kNAMIDINoteOnNotification";
static NSString* kNAMIDI_Note = @"kNAMIDI_Note";

...

これを case ステートメントの後に追加します

NSMutableDictionary* info = [[NSMutableDictionary alloc] init];
[info setObject:[NSNumber numberWithInteger:note] forKey:kNAMIDI_Note];
NSNotification* notification = [NSNotification notificationWithName:kNAMIDINoteOnNotification object:nil userInfo:info];
[[NSNotificationCenter defaultCenter] postNotification:notification];

これをView Controllerに追加して、通知を監視するためのメモを表示します

// notification to monitor for incoming midi note events
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(log:) name:@"kNAMIDINoteOnNotification" object:nil];


- (void)log:(NSNotification *)notification
{

    [NSThread isMainThread];

    NSDictionary* info = notification.userInfo;


    NSNumber *note;
    note = [info objectForKey:kNAMIDI_Note];

    BRMidiNoteName *noteConverter = [[BRMidiNoteName alloc] init];

    NSString *noteName;
    noteName = [noteConverter nameFromNumber:[note intValue] withNotation:[defaults valueForKey:kSettingsNotation]];

   [self.currentNoteLabel performSelectorOnMainThread: @selector( setText: ) withObject: noteName waitUntilDone: NO];

}

私のコードは実際に辞書を使用して、MIDI ノート番号をノート名に変換しています (EG ノート番号 60 = C4)。

于 2014-05-16T13:16:38.370 に答える