Ton mit bestimmter Frequenz erzeugen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ton mit bestimmter Frequenz erzeugen

    Moin!
    Kann mir jemand ein Stichwort oder noch besser ein Code-Schnippsel posten, mit dem man am Mac einen Ton mit einer bestimmten Frequenz erzeugen kann?
    Also, dass man zum Beispiel 10000Hz angibt, und die App einen Ton mit 10000Hz erzeugt und ausgibt.
    Vielen Dank!
    Osxer
  • Kein Problem:

    Quellcode

    1. //
    2. #import "AppDelegate.h"
    3. #import <CoreAudio/CoreAudio.h>
    4. #import <AudioToolbox/AudioToolbox.h>
    5. /** Das nächste Sample erzeugen */
    6. Float32 getNextSample() {
    7. static double phase = 0;
    8. phase += 6.282 * 440 / 44100; //440 Hz bei 44.1 kHz Sample Rate
    9. return sin(phase);
    10. }
    11. /** Callback, um einen Audio-Buffer zu füllen */
    12. OSStatus MyRenderCallback(void* inRefCon,
    13. AudioUnitRenderActionFlags* ioActionFlags,
    14. const AudioTimeStamp* inTimeStamp,
    15. UInt32 inBusNumber,
    16. UInt32 inNumberFrames,
    17. AudioBufferList* ioData) {
    18. for (int i=0; i<inNumberFrames; i++) {
    19. Float32 sample = getNextSample();
    20. for (int j=0; j<ioData->mNumberBuffers; j++) {
    21. Float32* base = ioData->mBuffers[j].mData;
    22. for (int k=0; k<ioData->mBuffers[j].mNumberChannels; k++) {
    23. base[i * ioData->mBuffers[j].mNumberChannels + k] = sample;
    24. }
    25. }
    26. }
    27. return 0;
    28. }
    29. @implementation AppDelegate
    30. - (void)applicationDidFinishLaunching:(NSNotification *)aNotification {
    31. //Default Output-Komponente suchen
    32. AudioComponentDescription desc;
    33. desc.componentType = kAudioUnitType_Output;
    34. desc.componentSubType = kAudioUnitSubType_DefaultOutput;
    35. desc.componentManufacturer = kAudioUnitManufacturer_Apple;
    36. desc.componentFlags = 0;
    37. desc.componentFlagsMask = 0;
    38. AudioComponent comp = AudioComponentFindNext(NULL, &desc);
    39. NSAssert(comp, @"Could not find default out component");
    40. //Eine Instanz davon erzeugen
    41. AudioComponentInstance outUnit;
    42. OSStatus err = AudioComponentInstanceNew(comp, &outUnit);
    43. NSAssert1(!err,@"AudioComponentInstanceNew failed with error %i",err);
    44. //Audio-Stream-Format setzen
    45. AudioStreamBasicDescription asbd;
    46. asbd.mSampleRate = 44100.0;
    47. asbd.mFormatID = kAudioFormatLinearPCM;
    48. asbd.mFormatFlags = kAudioFormatFlagsNativeFloatPacked|kAudioFormatFlagIsNonInterleaved;
    49. asbd.mBytesPerPacket = sizeof(Float32); //noninterleaved -> Beschreibung fuer EINEN Kanal
    50. asbd.mFramesPerPacket = 1;
    51. asbd.mBytesPerFrame = sizeof(Float32); //noninterleaved -> Beschreibung fuer EINEN Kanal
    52. asbd.mChannelsPerFrame = 2; //noninterleaved -> Anzahl Bufferlisten
    53. asbd.mBitsPerChannel = sizeof (Float32) * 8;
    54. asbd.mReserved=0;
    55. err = AudioUnitSetProperty (outUnit,
    56. kAudioUnitProperty_StreamFormat,
    57. kAudioUnitScope_Input,
    58. 0,
    59. &asbd,
    60. sizeof(asbd));
    61. NSAssert1(!err,@"AudioUnitSetProperty (asbd) failed with error %i",err);
    62. //Audio Unit initialisieren
    63. err = AudioUnitInitialize(outUnit);
    64. NSAssert1(!err,@"AudioUnitInitialize failed with error %i",err);
    65. //Render Callback setzen
    66. AURenderCallbackStruct renderCallback;
    67. memset(&renderCallback, 0, sizeof(AURenderCallbackStruct));
    68. renderCallback.inputProc = MyRenderCallback;
    69. renderCallback.inputProcRefCon = self;
    70. err = AudioUnitSetProperty (outUnit,
    71. kAudioUnitProperty_SetRenderCallback,
    72. kAudioUnitScope_Input,
    73. 0,
    74. &renderCallback,
    75. sizeof(AURenderCallbackStruct));
    76. NSAssert1(!err,@"AudioUnitSetProperty (callback) failed with error %i",err);
    77. //Los geht's!
    78. AudioOutputUnitStart(outUnit);
    79. }
    80. @end
    Alles anzeigen
    Multigrad - 360°-Produktfotografie für den Mac
  • Inzwischen würde ich auch CA vorziehen auch wenn die Hürde ein wenig hoch ist.
    Ich hatte mit ner App von mir die OpenAL nutzt das Problem, dass die Lautstärke der Sounds viel zu niedrig war, keine Ahnung warum das so ist. Im Finder war der Sound richtig laut.
  • Vielen Dank für den Code, mattik!
    Allerdings kommt bei mir beim Builden 5 Fehlermeldungen:
    "_AudioOutputUnitStart", referenced from:
    -[SinusTonAppDelegate applicationDidFinishLaunching:] in
    SinusTonAppDelegate.o

    Dasselbe noch viermal mit AudioComponentFindNext, AudioUnitSetProperty...

    Jemand ne Idee?
  • Osxer schrieb:

    Jetzt klappt's! Hast du eine Idee, wie man es am einfachsten umsetzt, dass der Ton per Schieberegler geregelt wird? Welche Methode muss aktualisiert werden'?

    Wie meinst du geregelt (die Tonhöhe)? dazu musst du den Puffer neu füllen, schau dir mal das Beispiel an wie das genau funktioniert.
    Oder pitchen, das wäre einfacher