• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Viele hassen ihn, manche schwören auf ihn, wir aber möchten unbedingt sehen, welche Bilder Ihr vor Eurem geistigen Auge bzw. vor der Linse Eures iPhone oder iPad sehen könnt, wenn Ihr dieses Wort hört oder lest. Macht mit und beteiligt Euch an unserem Frühjahrsputz ---> Klick

Audioprogrammierung mit Objective-C

  • Ersteller Mitglied 7974
  • Erstellt am

Mitglied 7974

Gast
Hallo!

Ich habe mir vor Kurzem unter Java einen kleinen Synthesizer gebastelt, der mir einfach nur Sinus-, Dreieck-, Sägezahn- und Pulswellen und Rauschen erzeugt. Das ging mit Java recht einfach, auch wenn ich ein wenig googlen musste, bis ich ein Code-Fragment fand, das ich auch kapierte.

Dieser Erfolg ist mir unter Objective-C allerdings noch verwehrt geblieben und deshalb wende ich mich nun an euch Objective-C-Gurus. Was genau will ich also?

Nun, ich möchte so auf die Soundkarte zugreifen können, dass ich in Echtzeit einen Audiostream an die Soundkarte übergeben kann, welcher dann natürlich auch ausgegeben wird. Unter Java sieht das in etwa so aus, wobei ich auf Fehlerbehandlung verzichte und stellenweise eher pseudocodeartig artikuliere:

Code:
import java.sound.sampled.*;
class SoundTest {
    public void synthesizer() {
        /* Audioausgabeeigenschaften konfigurieren */
        float sampleRate = 44100f;
        int bits = 16;
        int channels = 2;
        /* Entsprechendes AudioFormat erzeugen und Live-Synthese starten */
        AudioFormat af = new AudioFormat(sampleRate, bits, channels, true, false);
        SourceDataLine sdl = AudioSystem.getSourceDataLine(af);
        sdl.open();
        sdl.start();
        /* Nun Wellenformen erzeugen und an die Soundkarte übergeben */
        for (irgend; welche; bedinungen) {
            byte[] buffer = new byte[8];
            byte sample = /* Über irgendeinen Algorithmus irgendeine Wellenform berechnen */;
            /* Jedes buffer-Element mit sample befüllen */
            sdl.write(buffer, 0, 8);
        }
        /* Soundkartenzugriff wieder beenden */
        sdl.stop();
        sdl.drain();
        sdl.close();
    }
}

Ich hoffe, der Code zeigt euch, auf was ich hinaus will.

Wie dem auch sei, ich habe jedenfalls noch kein passendes Tutorial im Netz gefunden bzw. das CoreAudio-Tutorial von Apple einfach noch nicht kapiert. Es wäre daher echt super, wenn jemand von euch die Knoten in meinem Hirn entwirren könnte, indem er mir erklärt, wie ich den oben beschriebenen Java-Code nach Objective-C portieren könnte. Sobald der Soundkartenzugriff geklärt ist, sollte ich wieder allein zurecht kommen können.

Ich danke für jeden konstruktiven Beitrag.

Gruß,
Matthias
 

below

Purpurroter Cousinot
Registriert
08.10.06
Beiträge
2.858
In Objective-C/Cocoa: Gar nicht. Cocoa hat ausser NSSound und NSBeep nichts in der Richtung zu bieten

Die Schlagworte hier sind CoreAudio oder OpenAL

EDIT: Du kannst natürlich NSSound mit WAV Daten oder so füllen, das ist ja ziemlich leicht.

Alex
 

Mitglied 7974

Gast
Die NSSound-Methode kenne ich schon, aber damit kann man eben nur Audio-Dateien abspielen, wie du ja schon gesagt hast. Ich möchte aber keine Audio-Datei erzeugen und dann abspielen, sondern Samples direkt an die Soundkarte schicken, wie im Java-Beispiel beschrieben. Wenn das nur mit CoreAudio resp. OpenAL funktioniert, wäre ich froh über Instruktionen, denn ich bin aus dem Tutorial von der Developer Connection noch nicht schlau geworden.

Danke,
Matthias
 

Mitglied 7974

Gast
Ja, anhand dieser beiden Beispielapplikationen sollte ich eigentlich herausfinden können, wie es funktioniert. Danke!