Domanda

So che questo è un argomento molto vasto, ma sono stato dibatte intorno con demo ed i miei propri test e non sono sicuro se sto attaccando il problema in modo corretto. Così qualche indizio su dove dovrei cominciare sarebbe apprezzato.

L'obiettivo è quello di avere l'applicazione genera alcuni suoni sintetizzati, per le impostazioni dell'utente. (Questo non è l'unica funzione app, non sto ricreando Korg qui, ma synth è parte di esso.) L'utente dovrebbe impostare le impostazioni tipiche synth come un'onda, riverbero, ecc quindi sarebbe prendere quando la nota avrebbe giocato, probabilmente con un modificatore di passo e la velocità.

Ho giocato un po 'con unità audio e RemoteIO, ma solo a malapena capire quello che sto facendo. Prima di andare troppo in basso quel buco di coniglio, mi piacerebbe sapere se sono ancora nel campo da baseball a destra. So synth audio sta per essere di basso livello, ma spero che forse ci sono alcune librerie di livello superiore là fuori che posso usare.

In caso di indicazioni su dove cominciare, e che la tecnologia iOS io dovrei leggere qualcosa di più, per favore fatemelo sapere.

Grazie!

EDIT:. Fammi meglio riassumere le domande

Ci sono le librerie synth già costruite per iOS? (Commerciale o Open Source -. Non ho trovato alcuna con numerose ricerche, ma forse mi manca di esso)

Ci sono API di livello superiore che possono contribuire a generare i buffer più facile?

Supponendo che posso già generare buffer, c'è una migliore / modo più semplice per sottoporre tali buffer al dispositivo audio iOS rispetto al Audio Unit RemoteIO?

È stato utile?

Soluzione

Questa è una bella domanda. A volte mi chiedo le stesse cose e finisco sempre con il MoMu Toolkit dai ragazzi di Stanford. Questa libreria fornisce una bella funzione di callback che si connette a AudioUnits / AudioToolbox (non sono sicuro), in modo che tutto ciò che interessa è quello di impostare la frequenza di campionamento, la dimensione del buffer, e la profondità di bit dei campioni audio, e si può facilmente sintetizzare / processo di tutto ciò che ti piace all'interno della funzione di callback.

Ho anche raccomandare il Sintesi ToolKit (STK) per iOS che è stato rilasciato anche da Ge Wang a Stanford. Davvero cool stuff in audio sintetizzare / processo.

Ogni volta che Apple rilascia una nuova versione di iOS posso controllare la nuova documentazione, al fine di trovare un modo migliore (o semplice) per l'audio sintetizzare, ma sempre senza fortuna.

EDIT: voglio aggiungere un link al codice sorgente AudioGraph: https://github.com/tkzic/ audiograph si tratta di un'applicazione davvero interessante per mostrare le potenzialità di Audio Units, realizzato da Tom Zicarelli. Il codice è molto facile da seguire, e un ottimo modo per conoscere questo --Alcune sarebbe say-- contorto processo di trattare con un basso livello di audio in iOS.

Altri suggerimenti

Swift & Objective C

C'è un grande progetto open source che è ben documentato con video e tutorial sia per Objective-C e Swift.

AudioKit.io

Il modo più basso livello per ottenere i buffer alla scheda audio è tramite l'API AudioUnit, e in particolare l'AudioUnit remoteIO. Questo è un mucchio di parole senza senso, ma ci sono alcuni esempi sparsi per il web. http://atastypixel.com/blog/using-remoteio-audio-unit/ è uno.

immagino che ci sono altri modi per riempire i buffer, sia utilizzando il framework AVFoundation, ma li ho mai fatto.

L'altro modo per farlo è utilizzare openFrameworks per tutte le tue cose audio, ma che presuppone inoltre che si vuole fare il disegno in OpenGL. Strappando l'attuazione AudioUnit non dovrebbe essere troppo di un problema, però, se si vuole fare il disegno in un altro modo. Questa particolare implementazione è bello perché getta tutto per -1..1 galleggianti per voi a riempirsi.

Infine, se si desidera un inizio di salto su un mucchio di oscillatori / filtri / Linee di ritardo che si può agganciare nelle openFrameworks sistema audio (o qualsiasi sistema che utilizza le matrici di -1..1 carri) si potrebbe desiderare di controllare http://www.maximilian.strangeloop.co.uk .

Ci sono due parti a questo: in primo luogo è necessario generare i buffer di audio sintetizzato - questo è praticamente indipendente dalla piattaforma e avrete bisogno di una buona comprensione di sintesi audio di scrivere questa parte. La seconda parte passa i buffer ad un appropriato sistema operativo specifico API in modo che il suono viene effettivamente riprodotto. La maggior parte delle API per il supporto la riproduzione audio il doppio buffer o tamponi addirittura multipli in modo che sia in grado di sintetizzare i buffer future durante la riproduzione del buffer corrente. Su quale API iOS per l'uso, che probabilmente dipende da che tipo di architettura globale che avete per la vostra applicazione, ma questo è davvero la parte facile. La parte sintesi è dove avrete bisogno di fare la maggior parte del lavoro.

I know this is a little old, but this seems like the wrong approach to me - what you should probably be doing is finding an audio unit synthesizer that models the kind of changes that you want to do. There are many of them, some of them open source, others possibly licensable - and host the audio units from your code. The mechanisms described above seem like they would work just fine, but they're not really going to be optimized for the ios platform.

I know this topic is old, and I'm amazed that the situation on iOS still hasn't improved when it comes to audio.

However, there's a silver line on the horizon: iOS 6 supports the WebAudio API. I successfully managed to have a nice polyphone synth with barely a couple of lines in JavaScript. At least there are basic things like Oscillators available out of the box:

https://dvcs.w3.org/hg/audio/raw-file/tip/webaudio/specification.html

and (just to pick one example out of many)

I know this is a old post, but check out The Amazing Audio Engine.

The Amazing Audio Engine is a sophisticated framework for iOS audio applications, built so you don't have to.It is designed to be very easy to work with, and handles all of the intricacies of iOS audio on your behalf.

This came form the developer of AudioBus for iOS.

Basically it is going to be a toss up between audio queues and audio units. if you need to get close to real-time, for example if you need to process microphone input, audio units are your way to achieve minimum latency.

however, there is some limitation to how much processing you can do inside the render callback -- ie a chunk of data arrives on an ultrahigh priority system thread. And if you try to do too much in this thread, it will chugg the whole OS.

so you need to code smart inside this callback. there are few pitfalls, like using NSLog and accessing properties of another object that were declared without nonatomic (ie they will be implicitly creating locks).

this is the main reason Apple built a higher level framework (AQ) to take out this low level tricky business. AQ lets you receive process and spit out audio buffers on a thread where it doesn't matter if you cause latency.

However, you can get away with a lot of processing, especially if you're using accelerate framework to speed up your mathematical manipulations.

In fact, just go with audio units -- start with that link jonbro gave you. even though AQ is a higher-level framework, it is more headache to use, and RemoteIO audio unit is the right tool for this job.

I have been using the audio output example from open frameworks and the stanford stk synthesis library to work on my iOS synth application.

I have been experimenting with the Tonic Audio synth library. Clean and easy to understand code with ready to compile macOS and iOS examples.

At some point I've started generating my own buffers with simple C code from scratch to do basic stuff like sine generators, ADSR's and delays, which was very satisfying to experiment with.

I pushed my float arrays to speakers using Tonic's counterpart, Novocaine.

For example 256k use these for all the music it generates.

Just recently I found AVAudioUnitSampler, a super-easy way to playback sample based audio at different pitches with low latency.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top