2012-09-22 25 views
3

我想在我的Mac OS X中播放蜂鳴聲並指定持續時間和頻率。在Windows上,可以使用Beep function(.Net中的Console.Beep)完成。 Mac上有什麼等價物嗎?我知道NSBeep,但它不需要任何參數。用自定義頻率和持續時間鳴響

+0

你就不能創建使用CoreAudio的波形和播放? – 2012-09-22 20:38:52

+1

這可能有所幫助: http://stackoverflow.com/questions/347250/tone-generation-in-cocoa-touch –

回答

5

在Mac上,系統警報聲音是用戶選擇的採樣(預先錄製)的聲音。它通常聽起來不像一聲嘟嘟聲 - 它可能是一種不能作爲固定形狀,頻率和振幅的簡單恆定波形的鳴笛,聲響,喧譁或其他聲音。它甚至可以記錄用戶的聲音,或來自電視節目或電影或遊戲或歌曲的剪輯。

它也不需要只是一個聲音。其中一種輔助功能選項是當警報聲播放時閃爍屏幕;當您播放警報聲音(或自定義警報聲音)時會自動發生,但在通過常規聲音播放API(如NSSound)播放聲音時不會發生。

因此,沒有簡單的方法來播放指定和恆定的形狀,頻率和幅度的自定義嘟嘟聲。任何這樣的嘟嘟聲都會與用戶選擇的警告聲音不同,並且可能根本無法讓用戶感覺到。

要在Mac上播放警報聲,請使用NSBeep或稍微複雜一點的AudioServicesPlayAlertSound。後者允許您使用自定義聲音,但即使這些聲音也必須預先錄製,或者至少使用更多的Core Audio代碼來預先生成,而不是值得編寫。

我推薦使用NSBeep。這是尊重用戶選擇的一行代碼。

+0

謝謝,我最終做了什麼。 – Giorgi

2

我需要類似的應用程序功能。我最終寫了一個小的可重用類來爲我處理這個問題。

Source on GitHub

,用於產生具有指定頻率和幅度簡單的正弦波形的音頻音調可重複使用的類。可以連續播放或在指定的時間內播放。

的接口是相當簡單的,如下所示:

@interface TGSineWaveToneGenerator : NSObject 
{ 
    AudioComponentInstance toneUnit; 

@public 
    double frequency; 
    double amplitude; 
    double sampleRate; 
    double theta; 
} 

- (id)initWithFrequency:(double)hertz amplitude:(double)volume; 
- (void)playForDuration:(float)time; 
- (void)play; 
- (void)stop; 

@end 
0

下面是與新的AVAudioEngine/AVAudioNode的API這樣做的一種方式,而斯威夫特:

import AVFoundation 
import Accelerate 

// Specify the audio format we're going to use 
let sampleRateHz = 44100 
let numChannels = 1 
let pcmFormat = AVAudioFormat(standardFormatWithSampleRate: Double(sampleRateHz), channels: UInt32(numChannels)) 

let noteFrequencyHz = 440 
let noteDuration: NSTimeInterval = 1 

// Create a buffer for the audio data 
let numSamples = UInt32(noteDuration * Double(sampleRateHz)) 
let buffer = AVAudioPCMBuffer(PCMFormat: pcmFormat, frameCapacity: numSamples) 
buffer.frameLength = numSamples // the buffer will be completely full 

// The "standard format" is deinterleaved float, so we can assume the stride is 1. 
assert(buffer.stride == 1) 
for channelBuffer in UnsafeBufferPointer(start: buffer.floatChannelData, count: numChannels) { 
    // Generate a sine wave with the specified frequency and duration 
    var length = Int32(numSamples) 
    var dc: Float = 0 
    var multiplier: Float = 2*Float(M_PI)*Float(noteFrequencyHz)/Float(sampleRateHz) 
    vDSP_vramp(&dc, &multiplier, channelBuffer, buffer.stride, UInt(numSamples)) 
    vvsinf(channelBuffer, channelBuffer, &length) 
} 

// Hook up a player and play the buffer, then exit 
let engine = AVAudioEngine() 
let player = AVAudioPlayerNode() 
engine.attachNode(player) 
engine.connect(player, to: engine.mainMixerNode, format: pcmFormat) 
try! engine.start() 
player.scheduleBuffer(buffer, completionHandler: { exit(1) }) 
player.play() 

NSRunLoop.mainRunLoop().run() // Keep running in a playground 
相關問題