2016-12-04 5 views
-1

Pour jouer, je suis sur un AVAudioUnitSampler:Comment faire une lecture d'une note midi avec une durée déterminée

  sampler.stopNote(note, onChannel: channel) 

Mais pour arrêter je ne veux pas utiliser:

  DispatchQueue.main.asyncAfter(
       deadline: DispatchTime.now() + Double(Int64(0.7 * Double(NSEC_PER_SEC)))/Double(NSEC_PER_SEC)) 
      { 
       sampler.stopNote(note, onChannel: channel) 
      } 

Qu'est-ce qu'un meilleur Solution? Merci

+0

Utilisez-vous AVMIDIPlayer? Si oui, vous devriez le préciser, peut-être dans le titre de votre question –

+0

J'utilise AVAudioUnitSampler, mais je suis ouvert à d'autres façons – Lucas

Répondre

1

Vous pouvez créer une MusicSequence et chaque événement qui s'y trouve sera programmé par un MusicPlayer.

Vous pouvez utiliser AVMIDIPlayer, mais vous devez convertir MusicSequence en données car il ne gèle pas directement MusicSequence.

Si vous souhaitez émuler une note via un bouton, appuyez sur la touche et relâchez-la via la touche, puis utilisez MusicDeviceMIDIEvent.

let status = MusicDeviceMIDIEvent(midisynthUnit, noteCommand, noteNum, velocity, 0) 

Vous pouvez lire this pour plus d'informations sur l'utilisation AVAudioUnitSampler.

+0

L'exemple n'est pas ce que je cherche parce que je voudrais définir une durée prédéterminée à la note. J'ai essayé d'utiliser un MusicSequence et un MusicPlayer, mais je reçois une latence importante. Des conseils à ce sujet? – Lucas