HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2016
0515
Okura☆BEEPを使って同時に音を出す10解決


Okura☆

リンク

2016/5/15(Sun) 15:41:30|NO.75500

beepを使って一度に2個の音を出したいです。
DTMFの実験をしたいので、知ってる方は教えてください!



この記事に返信する


KA

リンク

2016/5/15(Sun) 20:58:10|NO.75504

過去スレを検索。



OKURA

リンク

2016/5/15(Sun) 22:32:04|NO.75507

探して出てこなかったので、ここに書いたのですが



可憐

リンク

2016/5/16(Mon) 13:59:29|NO.75511

自分も過去スレを探してみましたがありませんでした。



https://msdn.microsoft.com/ja-jp/library/cc428923.aspx
Beep関数について調べていると
スピーカから単純な音を鳴らします。この関数は同期で実行されます。音が鳴り終わるまでは、呼び出し側へ制御を返しません
とあるので、1度に複数の音を鳴らすのは不可能ではないかなと思います。。
間違った説明をしている可能性がありますので参考程度にして下さい



jsa120

リンク

2016/9/20(Tue) 17:43:09|NO.76916

適当なフォルダに音を鳴らすexeファイルを大量に用意してexecで起動はいかが?(笑)



MillkeyStars

リンク

2016/9/20(Tue) 20:16:57|NO.76917

基本的に Beep は仕様上無理です。もともと単音仕様として作られている為、周波数合成などはできません。
また、マルチスレッドで同時に Beep を鳴らそうとした場合、先の方は後の方にかき消されます。

やり方は単純で、HSP エディタ上で Beep を鳴らすスクリプトを複数作って、双方とも 5秒くらいの長さの Beep を鳴らします。
そうすると、先に起動した Beep の鳴らし時間終了が来る前に後のBeep に切り替わります。
(聞いてみるとわかると思いますが、合成されていません。)



jsa120

リンク

2016/9/22(Thu) 08:49:38|NO.76931

ホントですね。



KA

リンク

2016/9/22(Thu) 15:07:48|NO.76933

合成した周波数を短時間で区切り、それに相当するビープで鳴らす。



MillkeyStars

リンク

2016/9/22(Thu) 15:31:23|NO.76934

なんとなく作ってみた、ちょっと大きい無駄なスクリプト

#include "hspogg.as" #module ControlWaveDTMF /**************************************************** モジュール内部用です。 ファイルのヘッダーを作成します。 ****************************************************/ #deffunc CreateWaveHeader var WaveDataFile dim RIFFHeader,4 RIFFHeader(0) = 0x46464952 //識別'RIFF' RIFFHeader(1) = 12 RIFFHeader(2) = 0x45564157 //識別'WAVE' //必要な情報 FH_format = 1 //フォーマット FH_Channels = 1 //チャンネル数 FH_SamplingRate = 44100 //サンプリング周波数(Hz) FH_BitsPerSample = 16 //1サンプルのBit数 FH_BytesPerSample = FH_BitsPerSample / 8 //1サンプルのByte数 //下記は上記の必要な情報を元に計算 dim FileHeader,8 FileHeader(0) = 0x20746D66 //識別チャンク名 'fmt ' FileHeader(1) = 16 //サイズ (id と size を含めないヘッダーのサイズ) FileHeader(2) = FH_format //フォーマット[format] FileHeader(2) += FH_Channels << 16 //使用チャンネル数[Channels] FileHeader(3) = FH_SamplingRate //サンプリング周波数(Hz)[SamplingRate] FileHeader(4) = FH_SamplingRate * FH_BytesPerSample * FH_Channels //レート FileHeader(5) = FH_BitsPerSample / 8 * FH_Channels //データブロックサイズ FileHeader(5) += FH_BitsPerSample << 16 //1 サンプルあたりのビット数 dim DataHeader,4 DataHeader(0) = 0x61746164 //識別チャンク 'data' memcpy WaveDataFile,RIFFHeader,12,0 memcpy WaveDataFile,FileHeader,24,12 memcpy WaveDataFile,DataHeader,8,36 return /********************************************************************* モジュール内部用です。 波形データ部分を作成します。 *********************************************************************/ #deffunc CreateWaveData var WaveDataFile,int HzValue,int Time SizeOfSample = FH_SamplingRate * Time SizeOfBuffer = SizeOfSample * (FH_BitsPerSample / 8) * FH_Channels //data チャンクヘッダーに確定情報を書き込む DataHeader(1) = SizeOfBuffer memcpy WaveDataFile,DataHeader,8,36 //波形データを作成 Frequency = double(HzValue) Amplification = 0.6 Duration = double(Time) repeat SizeOfSample val = Amplification * sin(2.0 * M_PI * double(cnt) * Frequency / FH_SamplingRate) val_p = val * 32767.0 wpoke WaveDataFile,44 + (cnt * 2),int(val_p) loop return SizeOfBuffer /********************************************************************* CreateWaveMemory p1,p2,p3 p1 : 作成したデータを格納するバッファ p2 : 作成するHz値(数値) p3 : 作成する長さ(秒単位) この部分でファイル全体を作っています。 *********************************************************************/ #deffunc CreateWaveMemory var WaveDataFile,int HzValue,int Time FileEndPoint = 0 CreateWaveHeader WaveDataFile FileEndPoint += 44 CreateWaveData WaveDataFile,HzValue,Time FileEndPoint += stat //ファイルサイズ確定情報を入れる SizeOfFile = SizeOfBuffer + 44 - 8 RIFFHeader(1) = SizeOfFile memcpy WaveDataFile,RIFFHeader,12,0 return FileEndPoint #global mes "wave ファイルの作成開始" sdim WaveFileTemp,1250304 CreateWaveMemory WaveFileTemp,697,1 CreateFileSize = stat dim HzData,8 HzData(0) = 697,770,852,941,1209,1336,1477,1633 sdim WaveFile,CreateFileSize,12 repeat 8 CreateWaveMemory WaveFile(cnt),HzData(cnt),1 FileName = strf("DTMF_%d.wav",HzData(cnt)) bsave FileName,WaveFile(cnt),CreateFileSize loop mes "ファイル作成完了" mes "ファイルの読み込み開始" dmmini repeat 8 FileName = strf("DTMF_%d.wav",HzData(cnt)) dmmload FileName,cnt loop mes "ファイルの読み込み完了" //音声ファイルの組み合わせを作る(0〜9 と * #) dim SoundCombi,2,12 SoundCombi(0,0) = 3,5 //0 SoundCombi(0,1) = 0,4 //1 SoundCombi(0,2) = 0,5 //2 SoundCombi(0,3) = 0,6 //3 SoundCombi(0,4) = 1,4 //4 SoundCombi(0,5) = 1,5 //5 SoundCombi(0,6) = 1,6 //6 SoundCombi(0,7) = 2,4 //7 SoundCombi(0,8) = 2,5 //8 SoundCombi(0,9) = 2,6 //9 SoundCombi(0,10) = 3,4 //* SoundCombi(0,11) = 3,6 //# *main mes "DTMF 再生開始" SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 400 SoundPlay = 2 : SoundBreak = 200 : gosub *SoundControl : await 400 SoundPlay = 3 : SoundBreak = 200 : gosub *SoundControl : await 400 SoundPlay = 6 : SoundBreak = 300 : gosub *SoundControl : await 400 SoundPlay = 3 : SoundBreak = 200 : gosub *SoundControl : await 400 SoundPlay = 2 : SoundBreak = 200 : gosub *SoundControl : await 400 SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 400 await 500 SoundPlay = 3 : SoundBreak = 200 : gosub *SoundControl : await 400 SoundPlay = 6 : SoundBreak = 200 : gosub *SoundControl : await 400 SoundPlay = 9 : SoundBreak = 200 : gosub *SoundControl : await 400 SoundPlay = 11 : SoundBreak = 300 : gosub *SoundControl : await 400 SoundPlay = 9 : SoundBreak = 200 : gosub *SoundControl : await 400 SoundPlay = 6 : SoundBreak = 200 : gosub *SoundControl : await 400 SoundPlay = 3 : SoundBreak = 200 : gosub *SoundControl : await 400 await 500 SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 700 SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 700 SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 700 SoundPlay = 1 : SoundBreak = 200 : gosub *SoundControl : await 700 await 200 SoundPlay = 1 : SoundBreak = 100 : gosub *SoundControl : await 100 SoundPlay = 1 : SoundBreak = 100 : gosub *SoundControl : await 200 SoundPlay = 2 : SoundBreak = 100 : gosub *SoundControl : await 100 SoundPlay = 2 : SoundBreak = 100 : gosub *SoundControl : await 200 SoundPlay = 3 : SoundBreak = 100 : gosub *SoundControl : await 100 SoundPlay = 3 : SoundBreak = 100 : gosub *SoundControl : await 200 SoundPlay = 6 : SoundBreak = 100 : gosub *SoundControl : await 100 SoundPlay = 6 : SoundBreak = 100 : gosub *SoundControl : await 200 SoundPlay = 3 : SoundBreak = 200 : gosub *SoundControl : await 300 SoundPlay = 2 : SoundBreak = 200 : gosub *SoundControl : await 300 SoundPlay = 1 : SoundBreak = 300 : gosub *SoundControl : await 300 mes "DTMF 再生終了" stop *SoundControl dmmplay SoundCombi(0,SoundPlay),0 dmmplay SoundCombi(1,SoundPlay),0 await SoundBreak dmmstop -1 return



OKUDA

リンク

2016/10/14(Fri) 11:17:16|NO.77111

おおお…
すごいです…
本当に皆様ありがとうございます。
無事解決しました。



リンク

2016/10/15(Sat) 00:11:13|NO.77125

簡単な波形メモリ音源を作ってみたいと思っていたのですが
どこから手をつけて良いかわからず困っていたところでした。
大変参考になりました、ありがとうございました。



ONION software Copyright 1997-2021(c) All rights reserved.