Ho appena scoperto CABTMIDILocalPeripheralViewController
per iOS che gestisce le impostazioni utente per abilitare la rilevabilità MIDI Bluetooth. Questo è fine e buono, ma per integrare il bluetooth nel resto della connettività MIDI di rete della mia app sarebbe bene essere in grado di gestire l'abilitazione direttamente dal codice della mia app piuttosto che fare affidamento su questo VC opaco. Qualcuno sa se è possibile?Pubblicare manualmente MIDI MIDI su iOS, senza CABTMIDILocalPeripheralViewController
risposta
Non ci sono API pubbliche per gestire questa funzionalità. Dopo un'indagine con gli strumenti, sembra che l'interruttore causi un'istanza di CBPeripheralManager
. Presumo che esso configuri il dispositivo come una periferica Bluetooth e canali manualmente i dati da e verso uno MIDIEndpointRef
che è stato anche creato.
In altre parole, non esiste una soluzione di un solo liner. Se vado su questa strada ulteriormente vi posterò il codice meno che qualcun altro vuole avere un andare ...
UPDATE
Il codice magia ...
- (instancetype)init
{
self = [super init];
if (self) {
_peripheralManager = [[CBPeripheralManager alloc] initWithDelegate:self queue:nil];
}
return self;
}
//---------------------------------------------------------------------
- (void)peripheralManagerDidUpdateState:(CBPeripheralManager *)peripheral
{
if (peripheral.state != CBPeripheralManagerStatePoweredOn) {
return;
}
info(@"_peripheralManager powered on.");
// CBMutableCharacteristic *tx = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:RBL_TX_UUID] properties:CBCharacteristicPropertyWriteWithoutResponse value:nil permissions:CBAttributePermissionsWriteable];
//
rx = [[CBMutableCharacteristic alloc] initWithType:[CBUUID UUIDWithString:@"7772E5DB-3868-4112-A1A9-F2669D106BF3"] properties:CBCharacteristicPropertyRead|CBCharacteristicPropertyWriteWithoutResponse|CBCharacteristicPropertyNotify value:nil permissions:CBAttributePermissionsReadable|CBAttributePermissionsWriteable];
CBMutableService *s = [[CBMutableService alloc] initWithType:[CBUUID UUIDWithString:@"03B80E5A-EDE8-4B33-A751-6CE34EC4C700"] primary:YES];
s.characteristics = @[rx];
[_peripheralManager addService:s];
NSDictionary *advertisingData = @{CBAdvertisementDataLocalNameKey : BLE_NAME, CBAdvertisementDataServiceUUIDsKey : @[[CBUUID UUIDWithString:@"03B80E5A-EDE8-4B33-A751-6CE34EC4C700"]]};
[_peripheralManager startAdvertising:advertisingData];
}
Sono quegli ID che definiscono una periferica MIDI. Per saperne di più:
Apple ha usato per avere un documento a
... che non è più. Mi piacerebbe trovare una vecchia copia in quanto risulta essere più difficile da decifrare ...
Penso che si potrebbe essere alla ricerca di questo: CABTMIDICentralViewController più informazioni in questa pagina: https://developer.apple.com/library/ios/qa/qa1831/_index.html basicaly questo consente di acquisire e connettersi a dispositivi tramite la vostra applicazione. Non sono sicuro se vuoi solo essere scoperto o anche essere quello che esegue la scansione. Spero che questo aiuti
Ecco dove ho imparato a conoscere "CABTMIDILocalPeripheralViewController', che è sicuramente quello da usare nel mio caso. Ad ogni modo, questa pagina non descrive come eseguire l'attività senza utilizzare questi VC, che è ciò che voglio sapere. –
In realtà è piuttosto limitato a questi, forse a causa di misure di sicurezza. –
Ci sono app (ad es. Apollo Bluetooth) che lo fanno. Ho il sospetto che lo facciano manualmente senza il 'CABT ...' VC –
Quindi ho messo insieme una soluzione piuttosto hacky per scoprire quale dispositivo MIDI l'utente ha fatto clic una volta all'interno di CABTMIDICentralViewController. Non sono sicuro che questa sia una buona idea: se Apple cambia i componenti interni del controller, non funzionerà più. Inoltre, non sono sicuro che sia "legale" in merito alle linee guida sull'App Store. Qualcuno sa più informazioni su questo?
DPBleMidiDeviceManager.h:
#import <CoreAudioKit/CoreAudioKit.h>
@protocol MidiDeviceConnectedDelegate <NSObject>
-(void) onMidiDeviceConnected: (NSString*) deviceName;
@end
@interface DPBleMidiDeviceManager : CABTMIDICentralViewController
@property (weak, nonatomic) id<MidiDeviceConnectedDelegate> midiDeviceDelegate;
@end
DPBleMidiDeviceManager.m:
#import "DPBleMidiDeviceManager.h"
@implementation DPBleMidiDeviceManager
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
NSLog(@"midi device selected %@", indexPath);
[super tableView:tableView didSelectRowAtIndexPath:indexPath];
// TODO: this is very bad. apple may change their internal API and this will break.
UITableViewCell* cell = [tableView cellForRowAtIndexPath:indexPath];
if ([cell respondsToSelector:@selector(deviceNameLabel)]) {
UILabel* deviceLabel = [cell performSelector:@selector(deviceNameLabel)];
NSLog(@"midi device named %@", deviceLabel.text);
// must wait a couple seconds for it to actually connect.
[self performSelector:@selector(sendMidiDeviceConnected:) withObject:deviceLabel.text afterDelay: 3];
}
}
- (void) sendMidiDeviceConnected: (NSString*) deviceName
{
[self.midiDeviceDelegate onMidiDeviceConnected:deviceName];
}
@end
Poi, nel vostro controller della vista genitore, è possibile ottenere il risultato dal delegato e cercare un nuovo dispositivo MIDI corrispondenza quel nome:
...
DPBleMidiDeviceManager *controller = [DPBleMidiDeviceManager new];
controller.midiDeviceDelegate = self;
// now present the VC as usual
...
-(void) onMidiDeviceConnected: (NSString*) deviceName
{
[self connectMidiDevice: deviceName];
}
/**
Connects to a MIDI source with the given name,
and interprets all notes from that source as notes;
*/
- (void) connectMidiDevice: (NSString*) deviceName
{
NSLog(@"Connecting to MIDI device: %@", deviceName);
PGMidi* midi = [[PGMidi alloc] init];
if (midi != NULL) {
NSArray* sources = midi.sources;
for (PGMidiSource* src in sources) {
NSLog(@"Found midi source: %@", src.name);
if ([src.name containsString: deviceName]) {
NSLog(@"Connecting to midi source: %@", src.name);
[src addDelegate:self];
}
}
}
}
L'unica altra alternativa che posso è necessario cercare i dispositivi MIDI prima di mostrare il controller, salvare l'elenco dei dispositivi, quindi aprire il controller. Quando si chiude, scansiona di nuovo i dispositivi MIDI e diff quel nuovo elenco con quello vecchio. Qualsiasi nuovo dispositivo MIDI visualizzato sarà quello selezionato dall'utente. Non sei sicuro del motivo per cui Apple non ci abbia reso più facile ...
- 1. Riproduzione di file MIDI multi-strumento IOS
- 2. MIDI Over Bluetooth
- 3. Lettura di file MIDI
- 4. inviare messaggi MIDI tramite USB su Android
- 5. Come si suona il MIDI su iPhone?
- 6. MIDI OUT trasmettitore non disponibili
- 7. Invio MIDI l'USB utilizzando Arduino
- 8. Manipolare file MIDI in Python
- 9. Generazione dinamica di Midi e riproduzione su Android: possibile?
- 10. Libreria MIDI cross-platform semplice per Python
- 11. Invia segnale midi da C# a ableton
- 12. Java Midi in Mac OSX interrotto?
- 13. Supporto di musica MIDI in HTML5
- 14. Sintetizzatore MIDI Java - Impossibile cambiare gli strumenti
- 15. Silverlight può comunicare con uno strumento MIDI?
- 16. Principiante MIDI: è necessario suonare una nota
- 17. Creazione di file MIDI in Haskell
- 18. Invio di messaggi MIDI usando Python (su Ubuntu)
- 19. Come posso scrivere un file MIDI con Python?
- 20. Come recuperare i dati di input MIDI in C++?
- 21. Come pubblicare manualmente JAR su Maven Central?
- 22. Riproduzione di file midi con MusicPlayer & Music Sequence
- 23. Il controllo del volume midi Java non funzionerà
- 24. Converti struttura dati MIDI in Java (Elenco, Hash Map, ???)
- 25. Invio di messaggi MIDI a DAW in C#
- 26. Converti numeri di nota Midi per nome e ottava
- 27. Perché questo semplice programma CoreMIDI non produce output MIDI?
- 28. Come "rallentare" un file MIDI (idealmente in Python)?
- 29. Come posso convertire da midi a wav/mp3 in C#?
- 30. Come convertire correttamente i ticks MIDI in millisecondi?
Hai mai capito come usare queste cose? Sto usando CABTMIDICentralViewController e voglio veramente controllare quale dispositivo MIDI l'utente ha collegato nel mio codice (così posso collegarmi automaticamente al dispositivo MIDI corretto). C'è un modo per farlo, o dovremmo presentare alcuni bug con Apple? – phreakhead
Sto usando la versione Peripheral ma sulla base di ciò suppongo che una volta connessa diventi MIDIEndpointRef in modo che tu possa eseguire una query con l'API CoreMIDI. Dovrebbe avere il nome come "Connessione Bluetooth dell'iPhone di Hari Karam". Non è possibile modificare l'interno del VC. E non c'è altra API "CABTMIDI ..." per quanto posso vedere –
Ok. Ho messo insieme una terribile soluzione di hacking che posterò qui sotto. – phreakhead