Mac Os X でビープ音を再生し、期間と頻度を指定したいと考えています。Windows では、 Beep 関数( .Net ではConsole.Beep )を使用して実行できます。Macに同等のものはありますか?私は NSBeep を認識していますが、パラメーターを取りません。
4 に答える
Mac では、システム アラート サウンドは、ユーザーが選択するサンプリングされた (事前に録音された) サウンドです。多くの場合、それはビープ音のような音ではありません。クラクション、サンク、ブレ、または固定された形状、周波数、および振幅の単純で一定の波形としては成り立たないその他の音である可能性があります。ユーザーの声の録音や、テレビ番組、映画、ゲーム、歌のクリップであってもかまいません。
また、音だけである必要もありません。アクセシビリティ オプションの 1 つは、警告音が鳴ったときに画面を点滅させることです。これは、アラート サウンド (またはカスタム アラート サウンド) を再生すると自動的に発生しますが、NSSound などの通常のサウンド再生 API を介してサウンドを再生すると発生しません。
そのため、指定された一定の形状、周波数、および振幅のカスタム ビープ音を鳴らす簡単な方法はありません。このようなビープ音は、ユーザーが選択した警告音とは異なり、ユーザーにはまったく認識されない場合があります。
Mac で警告音を再生するには、NSBeep
または を使用します。やや複雑AudioServicesPlayAlertSound
です。後者では、カスタム サウンドを使用できますが、これらも事前に録音するか、少なくとも作成する価値があるよりも多くの Core Audio コードを使用して事前にアプリで生成する必要があります。
を使用することをお勧めしNSBeep
ます。ユーザーの選択を尊重するのは 1 行のコードです。
PortAudio には、これを行うためのクロスプラットフォーム C コードがあります: https://subversion.assembla.com/svn/portaudio/portaudio/trunk/examples/paex_sine.c
その特定のサンプルは、左右のスピーカーでトーンを生成しますが、周波数がどのように計算されるかを示していません。そのために、次のコードの式を使用できます: Java に特定の周波数を絶えず放出するためのライブラリはありますか?
新しい AVAudioEngine/AVAudioNode API と Swift を使用してこれを行う方法を次に示します。
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