サウンドプログラミン ..
239:デフォルトの名無しさん
06/08/19 07:28:47
音程が変っているのなら、サンプリング速度が変化しているからどこかの段階でLPFを入れておく必要があるよ。
そうじゃないと折り返し雑音が問題になる。
綺麗な音にしたいなら、最低2倍のオーバーサンプリングしておいた方がいいかもね。
音程が変らずに再生速度だけ変化させてるならサンプリング定理の問題じゃない
0.5を下回る場合に問題が出るという事は
0.5を下回ると同じ音を3度以上繰り返し利用しなければならなくなるけど
その処理がはいってないんじゃないの
240:デフォルトの名無しさん
06/08/19 09:10:42
>>238-239
書き方が悪くてすみません。
「音程を変化させずに速度変化をした」
処理です。
>>239
いいえ、3度以上の繰り返しについても問題なく実装しているはずです。
DirectSound+C#なので、部分抜き出しが難しいですが・・、
0.5以上1倍以下ではどれだけ細かい指定をしても平気なので、
ここにバグがあるわけでは無い・・・とは思うのですが。
decimal readCount = 0;
decimal readSpeed = 0.4;
for(writePoint=0;writePoint<(一秒分のバッファ長);writePoint+=(0.1秒分のバッファ長))
{
readCount += (double)readSpeed;
for(i=0;i<readCount;i++)
{
/* [readBufferに0.1秒分読み込み] */
}
/* [readBufferから書き込み用バッファにwritePoint位置でコピー] */
readCount -= (int)readCount;
}
/* [書き込み用バッファを再生バッファにコピー] */
という感じでの実装です。
なんだっけ、グラフィックとかで良く使う「斜めの直線を整数型のみで計算するアルゴリズム」を応用した感じなのですが。
241:デフォルトの名無しさん
06/08/19 09:12:30
あ、Shift+Enter間違えて押してしまった・・・。
改行と書き込みがメッセとは逆だから間違えるなぁ・・・
とりあえず、お二人のご意見から
オーバーサンプリング+アンチエイリアスについても実装を検討してみます。
242:デフォルトの名無しさん
06/08/19 09:16:02
あともう一点追記です。
240で示したソースの中で、i以外の変数はすべて
クラススコープです。iのみがメソッドスコープになっております。
readCountがメソッド呼び出し毎にリセット、というわけではありません。
おまけに分かりづらくてすみません・・・。
243:デフォルトの名無しさん
06/08/19 09:24:22
音程が変化していないという事は、サンプリングレートが変化してないわけでしょ?
だったら オーバサンプリングとかLPFは必要ないよ。
で、やっぱり3度利用する部分に単純にバグがあるのだと思うよ
もっとも3度も利用すると違和感があるという事なら当然そうだろうけどね
あまり2倍以上遅くする場合は、やっぱり無音期間を検出して、そこを出来るだけ引き延ばす方がいいと思うよ
たとえば0.1秒のブロックを0.05くらいに小さくして、そのブロックの音量が今までの音量より一定比率より小さいなら、
その部分の繰り返し回数を出来るだけ多くするとか
244:デフォルトの名無しさん
06/08/19 09:31:35
まてよ >>240の定数だと、引き伸ばしではなくて短縮なんだよね?
短縮で0.1秒単位に2ブロック以上連続してすてるようになると、音声だと何を言ってるのか判らないようになってしまう。
そこまで強力に短縮するなら、
まず周期性を検出して周期の整数倍の
もっと小さいブロック (1/30)〜1/60のような(ブロックというよりgranul) サイズにして
それを捨てるようにする。必要があるよ。
245:デフォルトの名無しさん
06/08/19 09:35:11
サウンドプログラムの本ってあんまりないよね
246:デフォルトの名無しさん
06/08/19 09:40:53
!バグ見つけた!
>>243
バッファを注意深く見たところ、きちんと三度利用されるところは三度利用されていました。
ですが、読み込み時に窓関数をかけるのではなく、書き込み時に窓関数をかけていたため、
一回目の利用>二回目の利用>三回目の利用
と、窓関数により一気に減衰していました。
これをなおしましたが、やはり違和感は酷いです。
どうやらご提案の通り、きちんと無音期間や繰り返し周期の懸念を行わないといけないようです。
>>244
いいえ、短縮ではなく延長です。
なぜならreadCountは
一回目のループで0.4→読み込まない(readBufferはデフォルト0配列)
→書き込みバッファには0が書き込まれる
二回目のループで0.8→読み込まない
→書き込みバッファには0が書き込まれる
三回目のループで1.2→読み込む(readBufferには0〜0.1秒分の)
→書き込みバッファには0〜0.1秒分のデータが書き込まれる
四回目のループで0.6→読み込まない
→書き込みバッファには0〜0.1秒分のデータが書き込まれる
五回目のループで1.0→読み込む
→書き込みバッファには0.1〜0.2秒分のデータが書き込まれる
という感じに機能するので・・・。
247:デフォルトの名無しさん
06/08/19 09:48:58
出来るだけ無音期間を検出して無音期間を引き延ばすのが第一
次善は、周期を検出してその周期の整数倍にgranulを切り出して
それを並べる
音声の場合は周期の揺らぎが音声らしさを作ってるから
母音の部分の極端な引き伸ばしは巧くゆかないけどね(周期性が増すと声が変ってしまうから)
やらないよりはマシ
248:236
06/08/19 09:52:20
うん、どうやらその方法をとるしか無い様ですね。
・・・分かり切ったことを聞いたようで、すみませんでした。
しかしそうすると演算量が極端にあがるなぁ・・・
全量ノルムチェックと倍速調整か・・・うは、頭いてえ
249:デフォルトの名無しさん
06/08/19 10:07:55
Σx^2はそんなコストはかららないでしょ
周期検出の方が計算コストの低いのを探すのは大変でしょ
250:236
06/08/19 10:22:12
>>249
やぁ、せっかくあちこちダイエットしたのになぁ、ってボヤキです。
再生に関係しない他のところが処理コスト食い過ぎで、
再生するとCPU利用率が3%くらい跳ね上がるもんですから。
実質的な問題はただ単に面倒くさいだけです、本当にすみません。
251:デフォルトの名無しさん
06/08/19 10:23:57
急に内容が難しすぎ。
252:236
06/08/19 10:32:11
・・・確率論的に乱数で処理の是非を決定して無音部分の処理確率をあげt
いや、やめておこう
253:デフォルトの名無しさん
06/08/19 10:40:30
>>234
毎サンプルデータ毎に
Xを入力 Yを出力 配列をM, rwp,
Y = X*(1-g) + LPF( M[ (rwp +T) % SIZE] ) *g
M[rwp] = Y
rwp=rwp % SIZE;
てな計算になるだけだから、別に遅延などそう必要ないでしょ
254:デフォルトの名無しさん
06/08/27 18:27:58
QuickTimeSDKつかいづらい・・・・・・・
255:デフォルトの名無しさん
06/08/30 15:08:42
波形を合成する機能をもったライブラリって例えば
どのようなのがありますか?
256:デフォルトの名無しさん
06/08/30 16:11:14
DirectSound
257:デフォルトの名無しさん
06/08/30 23:33:24
8000Hz,8bitで取り込んだ音の中に、1KHzの音が混じってるかどうかだけをリアルタイムに調べたいんですが、低スペックマシンで処理するのにおすすめの方法はありますか?
258:デフォルトの名無しさん
06/08/30 23:36:44
FFTを応用すればどうとでも出来るとおも
259:デフォルトの名無しさん
06/08/31 10:30:18
>>257
フィルタ使うのが軽い。
260:デフォルトの名無しさん
06/08/31 10:31:42
バンドパスフィルタを使って音量レベルを計ればいいんだ
261:デフォルトの名無しさん
06/08/31 13:25:22
音程を変えるのに FFT を使ってるソフトがあるらしいのだが、
どういう風に使ってるんだろう。
単純に区間に区切って FFT かけて周波数を n 倍して戻すのって、
時間軸で重複させるのと等価だよなぁ。
位相をうまく合わせればちっとは良くなる気もするが、窓関数かけてたら
ほとんど影響なさそうだし。
262:デフォルトの名無しさん
06/08/31 14:44:40
>>261
ヒント:フォルマント
263:デフォルトの名無しさん
06/09/01 07:53:32
>>17 を参照。
264:デフォルトの名無しさん
06/09/01 15:20:35
> 全体を一度に収まる大きなサイズのFFTで行う方法
これ試したことあるけど、まともな音にならない。
長い区間をフーリエ変換しても、意味のある情報は得られないと思う。
> ピッチシフトは周波数軸での単なるシフトではなく、指数的移動なので
これの意味が良くわからん。定数倍すりゃいいだけじゃないの?
265:デフォルトの名無しさん
06/09/01 19:12:02
>>264
恐らく「音程」に対して周波数係数が「指数」になるって言いたいんじゃないかな。
音程 周波数
-12 *2^(-12/12)
-11 *2^(-11/12)
・・・ ・・・
-1 *2^(-1/12)
±0 *2^(±0)
+1 *2^(+1/12)
・・・ ・・・
+11 *2^(11/12)
+12 *2^(12/12
だから・・・
まあ何かを勘違いしている恐れがあるけど
266:デフォルトの名無しさん
06/09/01 20:15:03
その周波数軸の定数倍をどう実現してるの?
たとえば 2^(+1/12) = 1.05946309435929526 となって綺麗な比率にはならない
特に低周波は目が荒くなるわけで
これを旨く処理するには exp(2πki)という指数=三角関数が必要にならない?
267:デフォルトの名無しさん
06/09/01 22:00:18
>>266
指数的な補完が必要ってことか。なるほど。そこまで考えてなかった。
でも、上にも書いてあるけど、周波数軸を a 倍するのって
時間軸を 1/a 倍するのと同じだよね。(音量は a 倍違うけども)
FFT 使う意味がいまいち分からないなぁ。
268:デフォルトの名無しさん
06/09/01 23:23:01
DARU/PITCH-SHIFTER!だと音程+1で1.05946314って表示されるよ。
綺麗な比率では無いけど考え方はあってるんじゃないの。
周波数軸上でスペクトルを上下させるのがピッチシフトだっけ?
269:デフォルトの名無しさん
06/09/02 11:50:35
>>267
たしかに。
下限周波数 f_low [Hz]で周波数スペクトルを測定するには、
有限の時間1/f_low [sec.]かかるので、
結局のところグレイン・サイズ 1/f_low [sec.]で
グレイン操作して、ピッチシフトを表現することしかできないね
270:デフォルトの名無しさん
06/10/05 00:10:57
URLリンク(pc.watch.impress.co.jp)
URLリンク(www.drk7.jp)
271:デフォルトの名無しさん
06/10/11 18:43:00
今、ASIO2.0のSDKのサンプルをいじってるんだが、どこで再生しているのかわからない。
誰か教えてくれません?
272:デフォルトの名無しさん
06/10/11 22:35:32
ASIO_Init()の中をループしている最中にbufferSwitchTimeInfo()がcallbackで呼ばれる
と思った
273:デフォルトの名無しさん
06/10/11 22:37:45
いやbufferSwitch()か・・・まぁその辺
274:デフォルトの名無しさん
06/10/12 00:30:37
確かにここらへんが怪しいとは思うんだけど、どういじくったら音を出せるのかがわからない。
asioCallbacks.bufferSwitch = &bufferSwitch;
asioCallbacks.sampleRateDidChange = &sampleRateChanged;
asioCallbacks.asioMessage = &asioMessages;
asioCallbacks.bufferSwitchTimeInfo = &bufferSwitchTimeInfo;
誰か音を出す方法を教えてくださいな。
275:デフォルトの名無しさん
06/10/12 00:57:17
あ、ごめんinit()は自作関数だったかもw 昔書いたのを適当に眺めて書き込んだんで・・・
再生するサンプルソースがあると思うけど要するにその辺のcallback定義して開始すると
ASIOのsystemからbufferSwitchTimeInfo()が呼ばれる。
その中で要求された形式に応じてbuffを充填して戻る
無音だかを再生するサンプルがあると思うんで〜Info()にbreakpoint貼って
要求されたcaseのmemsetを適当な波形を返すようにしてみるとか、その辺からやってみては。
276:デフォルトの名無しさん
06/10/25 23:43:20
bufferSwitchTimeInfo()をいじくったら音が出るようになったよ!
さんくす!
でもなんか音が途切れ途切れ。。。ブツブツだわ。
どうしたらスムースになるんだ?
誰かわかる人助けてください。
277:デフォルトの名無しさん
06/10/28 04:28:22
まだキャプチャーした音を再生するところまでしか作ってない「ヘボな段階」なので、
ファイル書き出し機能を作ってから聞けばいいのかもしれないのですが、
書き出し機能を作るときからおおまかな部分について知っておいた方がいいかなと
思いましたので、質問です。
キャプチャして録音しながら
DVDレコーダなんかでよくあるタイムシフトの機能を扱いたいと思っているのですが、
どういった手順になるのでしょうか?おおまかな流れについて教えて下さい。
waveもしくはmp3をストリームして録音しているときに単純にそのファイルを
開いて再生するだけなのでしょうか?
それとも、何かあらかじめ準備しなければならいことがあったり
特別な手順を踏んでタイムシフト用のファイルを作ったりしないといけないのでしょうか?
mp3でタイムシフトやるときとwaveでタイムシフトやるときのファイル形式による懸念点などありましたら、
それも教えて欲しいです。mp3でやってもwaveでやっても一緒なのでしょうか?
278:デフォルトの名無しさん
06/10/28 09:19:09
Adudacity でタイムシフト再生なんか出来たか?
279:デフォルトの名無しさん
06/10/28 09:20:00
あ、Audacityスレとまちがえてかいてしまったごめんよ。
280:デフォルトの名無しさん
06/10/28 12:41:11
>>277
FILE_SHARE_READでCreateFile()してやればいいんじゃね?
録音用のHANDLEと再生用のHANDLEで別にCreateFile()すればseek位置で干渉しないし。
wavはLR&チャンネルのバウンダリさえ気をつければどっから再生しても問題無いけど、
mp3は[4バイトのヘッダ+データ]のブロック単位でシークする必要がある。
てかmp3使うならエンコード/デコードのライブラリが必要。
フリーで転がってるソースはエンコはgogo、デコードはmpg123辺りかなぁ。
281:277
06/10/28 18:54:05
>>280
どうも、ありがとうございます。
それほど複雑な処理を必要としないさそうで、ちょっと安心しました。
waveとmp3でやり方が大きく違いそうだということもわかりました。特にmp3は敷居が高そうですね。
とりあえずwaveでタイムシフトを実現させることを目指そうと思います。
こんなプログラムは探せばに既にあるんでしょうけど、勉強を兼ねて自分でやってみようと思います。
ありがとうございました。
282:デフォルトの名無しさん
06/11/02 18:55:56
ADPCMの詳しい資料ってありませんか?
283:デフォルトの名無しさん
06/11/02 20:40:10
CCITTの規格書とかお金出せば買えるよ
284:デフォルトの名無しさん
06/11/03 01:30:14
>> 282
何が知りたいの?
285:デフォルトの名無しさん
06/11/04 15:55:44
OpenALでサウンドプログラムを組んでみたいんだけど入門的なサイトって無いだろうか?
286:デフォルトの名無しさん
06/11/05 00:01:03
linuxでC言語使ってサウンドプログラミングやってます。
録音したデータにFFTをかけたいんですが、
データの渡し方が分かりません。
URLリンク(adlib.rsch.tuis.ac.jp)
録音は↑のプログラムをベースにしています。
どなたかアドバイスをお願いします。
説明不足だったらすみません。
287:デフォルトの名無しさん
06/11/05 00:14:45
>>286
> linuxでC言語使ってサウンドプログラミングやってます。
> 録音したデータにFFTをかけたいんですが、
> データの渡し方が分かりません。
ここで聞くような内容じゃないだろ。
プログラム初心者板にでも行った方が幸せになれる。
288:デフォルトの名無しさん
06/11/05 00:25:33
read したとき bufに指定のフォーマット、サイズで
データが納まってるのでそれを処理すればよい。
289:デフォルトの名無しさん
06/11/05 01:01:41
>>287
すいません。
>>288
ありがとうございます。
解決しました。
290:デフォルトの名無しさん
06/11/05 02:00:31
あるmp3のファイルの波形データをサンプリングするフリーソフトってありますか?
time WavAmp
1 1.235
2 -0.256
3 8.242
4 -0.319
…
みたいな感じで、テキストデータに保存できるソフトです
291:デフォルトの名無しさん
06/11/05 02:12:00
>>290
質問する板が違います
二度と来るな
292:デフォルトの名無しさん
06/11/05 02:13:06
またきちゃいました(>_<)
質問する板ってどこ?
293:デフォルトの名無しさん
06/11/05 02:41:50
>>292
自分で作ればこの板でおk
294:デフォルトの名無しさん
06/11/05 03:12:10
>>293
実は自分でもジャンルがよく分かってないんです。
フーリェ変換や波形分析するのはここのスレの人なのかなって
スレ一覧見て思ったので聞いてみたのです。
完全体セルの「笑えよベジータ」って声があるんだけど、それをフーリェ変換したら
どうなるのかなと思ったもので。
フーリェ変換のプログラムは持っているので、
あとは時間きざみごとの波形データが数値として取れれば…
295:デフォルトの名無しさん
06/11/05 03:18:53
>>294
wavか何かに変換すればいいんじゃね?
296:デフォルトの名無しさん
06/11/05 03:51:06
>>295
wavに変換すれば解析可能なソフトがあるってことですかね?
何しろ、サウンドプログラミングはズブの素人なのです。
確か、数秒のファイルでもwavにすると500KBくらいになりますよね。
プログラムのソースで500KBって結構なデータ量になります。
音楽データにどのような情報が入っているのかは分からないのですが、
ただ、欲しい情報は「波のきざみ幅」と「きざみ幅ごとの振幅」の
二つのデータなのです。
単純に波の振幅と刻幅を抽出するソフトがあれば紹介してもらいたいのです。
プログラム板一覧を見て、このスレの人なら知ってる人がいるのかなと思って質問しました。
297:デフォルトの名無しさん
06/11/05 03:59:53
ソフトウェア板辺りで質問スレ探すかLinux板で同系列のスレ探しなさい。
298:デフォルトの名無しさん
06/11/05 04:02:59
了解しますた。
299:デフォルトの名無しさん
06/11/05 19:18:27
フリーソフトを使う事をプログラミングだと思ってるのか
300:デフォルトの名無しさん
06/11/05 22:32:01
>>299
バイナリから直に数値データって取れんの?
301:デフォルトの名無しさん
06/11/05 22:59:31
>>300
普通に取れるけど、取れても取れなくても、
フリーソフトを使う事をプログラミングとは言わない。
302:デフォルトの名無しさん
06/11/06 12:40:47
>>301
普通ってどうやるの?
303:デフォルトの名無しさん
06/11/06 13:06:21
>>302
普通にバイナリファイルを読み込めばいい。
バイナリファイルの読み込み方はスレ違い。初心者スレにでも池。
音声ファイルのフォーマットが知りたければぐぐれ。
304:デフォルトの名無しさん
06/11/06 13:20:44
>>303
どの言語がお勧め?
305:デフォルトの名無しさん
06/11/06 13:45:23
>>304
日本語でおk
306:デフォルトの名無しさん
06/11/06 14:00:48
>>304-305
吹いたw
307:デフォルトの名無しさん
06/11/06 14:28:46
>>303
ほんとに知ってて言ってるのこの人?
308:デフォルトの名無しさん
06/11/06 14:39:36
>>294
ソフトを自分で作ってやるなら
1、とりあえずMP3ファイルを 16bitWAV形式に変換して保存しよう(ツールは探してね)
2、WAV形式のファイルをバイナリでオープンして、(RIFF+チャンク)で検索してデータを取り出そう
3、かけたいFFTのサイズ以下になるように窓関数をかける -->判らなければ検索してね
4、FFTをかける(ステレオなら2変数を複素FFTでやる方法を使うといいよ)
5、周波数成分毎に絶対値を出しそう
FFTは周波数は比例軸で出るので、大抵は対数軸にしたいと思うので、ココがまあキモになるね
309:デフォルトの名無しさん
06/11/06 14:51:08
で、たぶん >>294のやりたいのは
短時間FFTを使って ソノグラム表示もどきをやりたいのだと思う
310:デフォルトの名無しさん
06/11/06 15:12:33
>>309
短時間FFTはなにかまずい?
311:デフォルトの名無しさん
06/11/06 15:26:54
>>308
あ、ありがとうございます。
これで作業の方針をきめられそうです。
御迷惑お掛けしました。
ありがとうございました。
312:デフォルトの名無しさん
06/11/06 16:03:51
>>310
まずくはないよ。
等Qの特性で分割して表示したいとか言い出すと、短時間FFTだと逆にメンドクサイだけで
313:デフォルトの名無しさん
06/11/06 17:24:35
OpenALのプログラムを勉強したいのですが初心者にも参考になるサイトはありませんか?
環境はOSがWindows2000,IDEはVisualStudio2003です。
まだOpenALのSDKは入れていないのでそのあたりから解説してくれているサイトであると助かります。
314:デフォルトの名無しさん
06/11/06 17:26:21
ググレカス
315:デフォルトの名無しさん
06/11/06 17:31:40
オープンソースだからソース見ればいいよ
316:デフォルトの名無しさん
06/11/10 16:31:33
WindowsVISTAに移行することを考え、今までのDirectSoundベースで組んできた
プログラムを全てOpenALに以降することを考えています。そこでお聞きしたいのですが、
DirectSoundベースのプログラムはクライアントPCにDirectXがインストールされていれば
ハードウェアだろうかソフトウェアだろうが問題なく音を再生することが出来ました。
これがOpenALに移行するとクライアント側のPCには最低限何をインストールしておく
必要があるでしょうか?またクリエイティブのサウンドカード(EAXをサポートしたもの)、
その他のサウンドカード、オンボードサウンド、で違いというのは生じますか?
317:デフォルトの名無しさん
06/11/10 22:49:27
URLリンク(www.openal.org)
公式のメーリングリストで聞けば?
318:デフォルトの名無しさん
06/11/28 01:48:49
a.midとb.midを同時再生するプログラムを書きたいのですが、
変数を二つ用意しても、二つ目を再生するところで
「指定したMIDIデバイスは既に使用されています。開放されるのをまってください」
という警告が出てしまいます。
mmsystem.hを使う方法で解決策はないでしょうか。
319:デフォルトの名無しさん
06/11/28 02:11:07
>>318
MIDIデバイスを二つ用意したら?
320:デフォルトの名無しさん
06/11/28 02:16:24
>>319
MIDIデバイスを二つ用意とはどのようにすればよいのでしょうか?
ハード面でということですか?
環境としては、PCにMIDIインターフェースをつなぎMIDI音源で音を鳴らしてます。
321:デフォルトの名無しさん
06/11/28 03:51:29
>>320
まず環境を書け。
使ってる言語、OS、再生に使用してるライブラリ、最低このくらいは質問時に書いとけ。
それとデバイスの意味がわからないならそこから調べ直せ。
MIDIはWAVEと違って同一デバイスに複数ストリームを流せないから、
MIDIOUTが2ポートあるデバイスで、例えばSC88なりに別々に流すしかない。
322:デフォルトの名無しさん
06/11/30 23:47:20
実験音楽的に、二つのmidiをマージしたいって事では…?
323:デフォルトの名無しさん
06/12/01 00:35:28
まぁそれだったら流す前に自分でトラックをマージしちゃえばいいだけのことだけどね
324:デフォルトの名無しさん
06/12/13 02:15:53
windows系ですけど、
MM_WOM_DONEなどのメッセージ処理中はwaveOutWriteとか使えないって記述をたまに見るんですけど実際どうなんですか。
325:デフォルトの名無しさん
06/12/13 07:45:02
windows系といっても色々。
昔は割り込み=コールバックだったり
タスクスイッチされてなかったりと
326:324
06/12/14 03:35:29
とりあえず95以降。
95で大丈夫ならその後でも大丈夫な気がするんですけど。
327:デフォルトの名無しさん
06/12/14 10:05:40
>>326
95は2000やXPとは根本的に別モノ。
328:デフォルトの名無しさん
06/12/14 13:05:50
95, 98, Me は MS-DOS だと思った方がいいぞ。馬糞にホイップクリーム。
329:デフォルトの名無しさん
06/12/14 18:00:56
アルゴリズムの質問なんですがここでいいですかね?
オーディオストリームのピークホールド処理(過去nサンプル中の最大値を出力)を作っているのですが、
一番安直と思われる方法=過去nサンプルをバッファしといて毎フレームでバッファ内を全サーチ
という方法で作ったところ、ちょっと重いです。高速な方法はないでしょうか。
330:デフォルトの名無しさん
06/12/14 18:26:50
>>329
1.過去の最高値と今の値を比較し、今の値が高ければ最高値を更新し、カウンタを0に
2.カウンタをインクリメント
3.カウンタが一定値を超えたら、過去nサンプル中の最高値を検出し、カウンタをそこからの値に
ってやりかたはどう? nの値によっては比較回数が減るよ。
331:デフォルトの名無しさん
06/12/14 18:53:14
>>330
おー、なるほど、すばらしいです。
聞いてよかった。早速試してみますー
332:デフォルトの名無しさん
06/12/14 22:04:56
>>330
ご報告、
入力波形の傾向によっても負荷の具合が変動するってことになりますが
平均して初めの方法よりかなり速いです。まじありがとうございます。
333:デフォルトの名無しさん
06/12/14 23:09:33
>>330-332
それならば「最高値」を2つ持つようにすればどうだ?
それぞれA値・B値と呼ぶことにする。
1.A値と今の値を比較し、今の値が高ければA値を更新し、カウンタを0、B値を0に
2.カウンタをインクリメント
3.B値と今の値を比較し、今の値が高ければB値を更新、カウンタの値を記憶
4.カウンタが一定値を超えたら、記憶しておいた値に更新、A値にB値を代入し、B値を0に
334:デフォルトの名無しさん
06/12/14 23:10:48
すまん間違えた。
4. を修正
4.カウンタがnを超えたら、(n-記憶しておいた値)に更新、A値にB値を代入し、B値を0に
335:デフォルトの名無しさん
06/12/14 23:12:00
ん、なんか微妙に違うかもしれない。
ともかく、1位だけじゃなく2位も記憶しておけばいいんじゃないかってことだ。
336:デフォルトの名無しさん
06/12/14 23:54:00
>>333
試してみるまでもなくダメっぽいな・・・
337:329
06/12/15 00:04:49
1位の期限が切れたとき、途中で保存しておいた2位を新しい1位とするみたいな感じですよね?
実はじぶんもそうゆうの考えたんですがね、ややこしくてあきらめちゃったんですよね。
そう簡単にはいかなかったような・・・
これって一見とても単純な処理なのに、速いアルゴリズム考えようとすると、
思いのほかアレ?て感じゃありません?
だから330の即レスはけっこう目からうろこですた
338:デフォルトの名無しさん
06/12/15 01:17:37
2位なんているの?
ビデオのメーター見てても2秒毎にリセットしてるだけだよ。
339:デフォルトの名無しさん
06/12/15 02:15:13
本人が満足するのが一番の解でYO
340:329
06/12/15 02:17:36
メーターだったらそんな感じで十分なんでしょうけど、リミッター作ってるとこでして。
341:デフォルトの名無しさん
06/12/15 10:36:30
WAVデータのサンプリング変換って、どーやりますか?
例えば、11025で8ビットのものは、1バイトの音声データの羅列で、
22050で16ビットのものは、2バイトの音声データの羅列で、
22050は、11025の2倍だから、22050を11025にするには、
out[0] = in[1];
out[2] = in[5];
out[3] = in[9];
:
とやってくだけでOKだと思った。
が、音がザーザーです。
342:デフォルトの名無しさん
06/12/15 10:49:48
>>340
メーターだとこんなやり方もある。
あなろぐ VU メーターっぽい動き。リミッターにも使えるんじゃない?
過去のpeakを減衰させて現在値と比べる方法。
peak = peak * 0.999; // peak = max(peak-k, 0) でもなんでもいい。減衰するように。
peak = max( peak, current_sample);
343:デフォルトの名無しさん
06/12/15 10:52:44
>>341
8bit PCM は、ふつー符号無しデータで、0x00が負の最大、0x80が無音、
0xffが正の最大。
344:デフォルトの名無しさん
06/12/15 10:52:52
>>341
リサンプリング LPF とかでググってみて。
手を抜く場合には単純に out[0] = (in[0] + in[2]) / 2 とか。
345:デフォルトの名無しさん
06/12/15 12:30:44
>>343
いまく行きました。ありがとうございました。
>>344
2バイト値を1バイト値に変換する場合、単に上位バイトを格納すれば良いだけです。
これで、256で除算したことになります。
346:デフォルトの名無しさん
06/12/15 12:32:37
>>345
サンプリング周波数 22050Hz のデータから 11025Hz への変換かとオモタ
347:デフォルトの名無しさん
06/12/15 12:38:08
>>343
16bitPCMは符合有りなんだっけ?
348:デフォルトの名無しさん
06/12/15 12:52:55
22050Hz から 11025Hz にする場合、たんに間引けばいいだけじゃん?
平均取ると何か良くなる?
349:デフォルトの名無しさん
06/12/15 13:10:50
>>347
WAVのPCMに関しては、そう。
それ以外の文脈だと、符号有り8bitや符号無し16bitのPCMももちろん使
われることがある。
350:デフォルトの名無しさん
06/12/15 16:48:16
>348
それだとエイリアシングノイズ乗るでそ。
344のでも1/2以上のリサンプリングで乗るけど。
詳しくはFIRとかIIRとかで調べてみて。
351:デフォルトの名無しさん
06/12/15 17:18:03
>>348
サンプリングレート変換の時はLPFを通して先に高域をカットしなきゃダメ。
中途半端な周波数落としをするときはウェーブレットなんかで補間したほうがノイズが減る。
352:デフォルトの名無しさん
06/12/20 14:26:55
FIRフィルタ(ローパス/ハイパス)のインパルスを
カットオフ周波数をパラメタとしてリアルタイムで生成したいんですが、
どこかにcコードサンプルとかないでしょうかね?
数学を理解して自分で書くのは無理そうでして・・・
353:デフォルトの名無しさん
06/12/20 21:48:52
>>341
幾何学的な手法なら、三次曲線で補完とか、ガウシアンフィルタかける方法もあるぞ。
354:デフォルトの名無しさん
06/12/21 00:15:30
>>352
sinc関数 sinc(x)=sin(x)/(x) にあなたの好みの肩特性の窓関数をかけるだけ
だが、あなたの好みが判りません。
355:デフォルトの名無しさん
06/12/21 00:16:19
>>353
結局全て LPFなのさ
356:デフォルトの名無しさん
06/12/21 01:54:43
>>354
そんなにシンプルな感じなんですか?
でもすいません、sincだけでは意味がわからないです・・・
xはなんでしょう?どこでフィルターの種類やカットオフはどこで決まるのでしょう。
窓はhammingでよいかと思います。
357:デフォルトの名無しさん
06/12/21 07:05:28
判ったよ。手取り足取り教えてくれというわけだ。
sincは検索用のキーワード これで検索しろって意味だ
w:=2*π*f0/fs として
xが0でなければ sin( x * w) /x xが0の時 w
xを整数で±の窓関数の範囲で、窓関数を掛け算
で,ゲインがπあるから、それは除算するし、窓関数のゲイン分も掛け算すると
358:デフォルトの名無しさん
06/12/21 07:14:27
フィルターの種類は、実際に係数を設定してどんな特性になるか見てみりゃいいだろ
理想LPFと理想HPFは 足せばフラット = 1 になるから 中央値以外は符号が反転するだけだ
359:デフォルトの名無しさん
06/12/21 10:34:01
>>355
そうなんだけど、フーリエ変換しないでいいからとっつきやすいかな、と。
360:352
06/12/21 15:28:35
>>357-358
おしえていただいた内容と、徹夜でネットをしらべまくった結果、
数学はさておき、無事うまく動作するコードが書けました。
思ってたよりシンプルなコードになったので驚きです。
ハイパスはローパス用のインパルス応答の振幅が反転された形になるんですね。
プログラムが生成したインパルス応答からフィルタ特性を解析したところ、特性も良好でした。
どうもありがとうございました。
361:352
06/12/21 21:24:16
すいません、ハイパスについては間違えてたみたいですね・・・
362:デフォルトの名無しさん
06/12/21 23:33:28
サンプリングレートが44100/1secだとすると、この場合の1sec/44100の単位はなんて呼称すれば良いんでしょうか
363:デフォルトの名無しさん
06/12/21 23:55:15
1sec/44100 → (1/44100)秒
364:デフォルトの名無しさん
06/12/22 01:01:27
sec per samplingrate?
365:デフォルトの名無しさん
06/12/22 01:48:01
いちサンプル
366:デフォルトの名無しさん
06/12/22 03:34:30
sample per rate
367:デフォルトの名無しさん
06/12/22 07:19:21
>>361
もう判ったと思うけど 中央の係数のみ 1-a の関係になって、他の係数は負数にすればいいだけ
368:デフォルトの名無しさん
06/12/22 13:42:29
ASIO SDKのhostサンプルがシンプル過ぎるのもどうかと思う今日この頃。
やっと音が出た…orz
369:369
06/12/23 22:12:57
なんかディスクI/Oが少しでも集中すると再生が途切れる…。
やっぱりスレッド使って処理を分けないとダメか。
370:368
06/12/25 10:56:31
なんか適当にスレッド作って
読込処理を非同期にして
少し多くバッファリングしたら
飛ばなくなった。
出来たプログラムはwavの非圧縮PCMしか
再生できないけどなんだか嬉しい。
371:デフォルトの名無しさん
06/12/25 22:03:51
ゲームに関して何だけどPCにマイクを接続して喋ってるんだけど
EAXを使ったゲームを起動するととたんに俺のヴォイスにエコーが
かかるようになる。どうもそのPCゲームがEAXを使っているとそれに
つられてマイク入力の音声にもエコーみたいな効果が強制的に
かけられてしまうらしい。これって現状仕方がないことなん(´・ω・`)?
372:デフォルトの名無しさん
06/12/26 00:08:53
>>371
板違い。
373:デフォルトの名無しさん
06/12/26 02:36:50
>>372
ゲーム系のサウンドプログラムもこのスレの範疇かと。
374:デフォルトの名無しさん
06/12/26 05:49:50
サウンドプログラム? どこが?
ゲームの設定かOSの設定だろ?
375:デフォルトの名無しさん
06/12/26 07:49:50
>>371
ゲーム作ってるの?
376:デフォルトの名無しさん
06/12/26 10:06:05
>>371
非サラウンド環境でEAXを使ったら、そらエコーがかかっただけみたいになるがな。
377:デフォルトの名無しさん
06/12/26 15:12:35
>>371
クリエイティブのサウンドカードだろ?
仕様だ。
市場を一社独占させるとどうなるかの好例だな。
378: 【吉】
07/01/01 03:43:35
あけおめ♪
379:デフォルトの名無しさん
07/01/01 13:25:07
黙れよ
380:デフォルトの名無しさん
07/01/11 20:06:07
…FFTで… いや、ごめん。 いいや……。(´・ω・`)
381:デフォルトの名無しさん
07/01/15 21:13:43
ぉぃぉぃ…
382:デフォルトの名無しさん
07/01/16 20:41:58
低速フーリエ変換ってないの?
383:デフォルトの名無しさん
07/01/16 23:35:48
DFT?
384:デフォルトの名無しさん
07/01/17 00:14:21
筆算
385:デフォルトの名無しさん
07/01/17 10:20:29
>>382
バタフライ演算をしなけりゃ低速だよ。
386:デフォルトの名無しさん
07/01/17 16:11:17
普通にDFTでええんちゃう?
387:デフォルトの名無しさん
07/01/18 21:42:16
>>6 >>13 >>17
/*
Risa [りさ] alias 吉里吉里3 [kirikiri-3]
stands for "Risa Is a Stagecraft Architecture"
Copyright (C) 2000-2007 W.Dee <dee@kikyou.info> and contributors
See details of license at "license.txt"
*/
/*
Phase Vocoder (フェーズ ボコーダ ; 位相ボコーダ)の実装
参考資料:
URLリンク(www.panix.com)
Phase Vocoder のチュートリアル。「ミュージシャンにもわかるように」
書かれており、数学音痴フレンドリー。
URLリンク(www.dspdimension.com)
無料(オープンソースではない)の Time Stretcher/Pitch Shifterの
DIRACや、各種アルゴリズムの説明、
Pitch Shifter の説明的なソースコードなど。
URLリンク(soundlab.cs.princeton.edu)
real-time phase vocoder analysis/synthesis library + visualization
ソースあり。
*/
388:デフォルトの名無しさん
07/02/13 23:56:25
WAVで16bitの場合はサンプルごとにshort型にいれてるんだけど、
24bitの場合はどうすんの?
32bitは各サンプルをfloatにぶち込めばOK?
389:デフォルトの名無しさん
07/02/14 00:31:38
longでええやん
390:デフォルトの名無しさん
07/02/15 07:11:45
パソコンで処理をする目的なら、入力が何bitだろうと64bit浮動小数点で処理するのが楽だろう
・・・・整数演算の方が早いというような事を言いたい人なら別だが
391:デフォルトの名無しさん
07/02/15 11:31:37
>>390
16bitはshortに入れているのに?
392:デフォルトの名無しさん
07/02/15 12:19:02
wavファイル(RIFFフォーマット)の話だろ?
WAVE_FORMAT_PCM(=1)は整数の8bit,16bitしか定義されてないんじゃね?
393:デフォルトの名無しさん
07/02/15 13:29:51
しかしBitsPerSampleにはいくらでも入れられる
入れるだけなら自由だ
394:デフォルトの名無しさん
07/02/15 17:36:11
本気で言ってるなら池沼。
395:デフォルトの名無しさん
07/02/16 00:41:30
内部は64bit浮動小数点、外部とのやりとりは24bit整数、あたりが標準的?
396:デフォルトの名無しさん
07/02/16 04:09:13
>>395
全然。
例えばそこらのアプリの音声再生プラグインは、音質よりも軽くしたい場合が多いでしょ。
397:デフォルトの名無しさん
07/02/16 04:11:09
逆に、音声処理で精度が欲しいってんなら、内部80bit浮動小数点が使える環境を利用するだろうしさ。
398:デフォルトの名無しさん
07/02/22 20:54:32
複数のPCMを単一のPCMにミックスしたいんだけどどうすりゃいいのかわからない。
399:デフォルトの名無しさん
07/02/22 22:06:11
>>398
加算した後でレベル調整でもすればいいんじゃね?
400:デフォルトの名無しさん
07/02/22 23:50:53
レベル調整は先にやったほうが良くない?
401:デフォルトの名無しさん
07/02/23 07:55:27
PCMは8bitか16bitだから 32bit型に一度入れてから割り算すればいい
たとえばA,B,Cを 30%:20%:20% でMIXする場合
int vrA=30;
int vrB=20;
int vrC=20;
int total=vrA+vrB+vrC;
int w= A*vrA+B*vrB+C*vrC;
return w / total;
}
402:デフォルトの名無しさん
07/02/25 13:09:25
>>399-401
みんなありがとう。
やっぱ足して割ればいいのか。
403:デフォルトの名無しさん
07/03/15 11:42:48
ステレオWavデータのPAN設定のやり方教えてくださ
ぐぐったけど、どうも該当するものが発見できなかったんで
404:デフォルトの名無しさん
07/03/15 20:48:50
左右に振るだけじゃないの?
405:デフォルトの名無しさん
07/03/15 21:06:13
たぶんパンを振るとき左右それぞれにどういう演算するかって話だろ
その辺のシンセとかだと、右チャンネルの場合 L 0% - C 50% - R 100% って変化してたと思う
この場合だとセンターの時音量下がって聞こえるけどね。
DirectXだとセンターが両方とも100%で、右に寄せるときは左を下げてくんじゃなかったかな。
この場合センターの時音が大きく聞こえる
406:デフォルトの名無しさん
07/03/15 21:22:13
>>405
> その辺のシンセとかだと、右チャンネルの場合 L 0% - C 50% - R 100% って変化してたと思う
> この場合だとセンターの時音量下がって聞こえるけどね。
つか、左寄せの場合もセンターの場合も右寄せの場合も同じ音量
> DirectXだとセンターが両方とも100%で、右に寄せるときは左を下げてくんじゃなかったかな。
> この場合センターの時音が大きく聞こえる
この場合は正解。センターの時は、左寄せ, 右寄せの時の倍 (+6dB) になる
407:デフォルトの名無しさん
07/03/15 21:29:00
>>405
・音のエネルギーは振幅の2乗に比例する
・聴覚は対数特性
この辺がヒントになるかも。
408:デフォルトの名無しさん
07/03/15 22:24:48
ハードウェア・ミキサーだとセンターは3dB落ちがデフォ。
PAN振りっきりならスピーカーは1本しか鳴らないけど
センター時は2本同音量で鳴るから音量は3dBアップ。
これを補正するための3dBダウン。
これでL-C-RとPAN移動させても横一直線で移動する。
6dBダウンは再生/演奏時にモノ・ミックスされるケースを想定してのもの。
(回路内のミックスは電圧なので6dBアップ)
ハードウェア・シンセはモノ・アウトも装備する関係でそうしてあると。
409:デフォルトの名無しさん
07/03/15 22:36:58
>>406
ん?センターは-3dbでしょ?
20*log(sqrt(0.5^2 + 0.5^2)) = -3.010299956639811
でいいんだよね?
だからDirectXの場合だと+3dbだったと前勉強したときは思ったんだけど・・・
間違ってる?
410:デフォルトの名無しさん
07/03/16 02:09:49
正解は >>407-408
411:デフォルトの名無しさん
07/03/19 12:27:37
誰かDAW作ってくれ
412:デフォルトの名無しさん
07/03/20 10:48:51
>>411
frieve
413:デフォルトの名無しさん
07/03/31 10:17:20
エフェクトのコーラスのうねりは時間で変化させるんですか?
それともpitchを変化させるんですか。
414:デフォルトの名無しさん
07/03/31 10:39:30
コーラス:
入力音を二つに分岐させる。
片方にモジュレーション(周波数変調)をかける。
二つを加算して出力。
415:413
07/03/31 10:55:39
コーラスとフランジャーは モジュレーション大きさだけの違いだけなんですか?
416:デフォルトの名無しさん
07/03/31 11:45:55
・モジュレーション幅
・モジュレーション速度
・フィードバック量
・分岐させた二つの加算割合
などを変化させることによってコーラス/ビブラート/フランジャーなどが作れる。
417:デフォルトの名無しさん
07/03/31 11:50:26
>>416
それの大きさで呼び名が変わるってこと?
なんどもすんません。
418:デフォルトの名無しさん
07/03/31 12:30:34
そういうこと。
モジュレーション幅が広めで速度が速いとコーラスっぽくて、
モジュレーション幅が狭めで速度が遅いとフランジャーっぽい。
フランジャーの場合はフィードバック量も関係してくることが多い。
419:413
07/03/31 12:34:58
サンキュです
420:デフォルトの名無しさん
07/03/31 12:36:08
いえいえ。
421:デフォルトの名無しさん
07/04/01 18:59:37
ぉぃぉぃ
一応混じれ酢すると
ふらんじゃー: 数ms以下の短いディレイに変調をかけ、元音とミックスして、
中〜高音域のコムフィルター効果でメタリックな響きを出す
こーらす :数十〜ms程度の比較的長いディレイに変調をかけ、元音とミックスして、
(たぶん超低域のコムフィルター効果で)アンビエントな音のウネリを出す
422:418
07/04/01 22:34:53
>>421
補足サンキュ。418では変調速度と変調幅だけしか言及してなかった。
(変調幅を大きくする≒ディレイ値を大きくしないといけない
という勝手な理解をしてしまったよ。)
確かにディレイ値のほうが大きな影響があるな。
423:デフォルトの名無しさん
07/04/02 00:32:07
だけど、コーラスのきついやつがフランジャー、って理解でそう間違ってないでしょ?
424:デフォルトの名無しさん
07/04/02 00:33:53
おまぃに関してはおまぃの判断に任せる
425:デフォルトの名無しさん
07/04/02 01:31:19
コーラスのディレイの短いやつがフランジャー、って理解で間違ってない。
426:413
07/04/02 12:28:37
勉強になります。
427:418
07/04/02 16:25:13
理工系の大学とかで学術論文にアクセスできるのであれば、
Jon Dattorro. "Effect Design, Part 2: Delay-Line Modulation and Chorus". Journal of Audio Engineering Society, October 1997.
とか、あとは「DAFx」という書籍もエフェクト関係の勉強になる。
両方とも英語なのがタマニキズ。
428:デフォルトの名無しさん
07/04/02 17:10:08
>>425
登場経緯的には、フランジャーが先だよね? 浅めに(?)かけてみたら 12 弦っぽい
効果があって、それ目的でパラメーター調整しやすいようにアレンジして製品化した、と。
429:413
07/04/04 09:16:25
>>427
DAFxはいろいろ載ってておもしろそうですね。
Jon Dattorro Effect Designは見れなかった。残念
ただ、英語はダメなので気長にみてみます。
430:デフォルトの名無しさん
07/04/04 09:21:13
基本的にはパラメーターのレンジを変えた、同じエフェクトと思っていいと思うけど、
実際には目的の違いから異なるアイデアを盛り込んでる場合が多いと思うよ。
たとえばコーラスはぶ厚く広げるのが目的だからディレイラインがすごく多いものとか、
変調が周期波形じゃないものとか、イロイロと。
そのへんがエフェクターの個性になってくわけだが。
431:デフォルトの名無しさん
07/04/06 04:03:47
今までDSP買ってエフェクターやら作ってたんだけど、ふと思った。
いい加減今のPCならリアルタイム入出力のFIR処理くらい出来るんじゃないかと。
これが出来ればあらかじめフィルタ係数用意して切り替えるようにすれば
ソフトウェアエフェクターってできそうだし。
で、作って見たがあえなく撃沈。音途切れ途切れ。
何が問題なんでしょう??
100万タップくらいのFIRなら余裕で動くと思ってたのに。
432:デフォルトの名無しさん
07/04/06 07:58:42
あまり詳しくないのであれなんだが
とりあえずSSEは使った?(PowerPCならAltivec
大きいFIRはFFT利用して劇的に計算コスト減らした実装ができるんじゃなかったけか?
433:デフォルトの名無しさん
07/04/06 08:02:06
ちなみにリアルタイム入出力のコンボリューションリバーブとか普通にありますよ。
434:デフォルトの名無しさん
07/04/06 09:20:49
たいてい432の言うようにFFTかましてるよね。だからレイテンシーが問題になることも。
435:デフォルトの名無しさん
07/04/06 12:33:04
>>431
ハードウェアのことあんまり詳しくないんだけどフィルタ係数や入力信号のバッファ
がL1 L2 超えて外部になると一気にメモリ転送の問題が発生する気がする
メモリのレイテンシーって結構デカイ気がするけど詳しい人教えて
>>433
ちょっと俺も興味あるんだけど そのソフトの詳細希望
>>434
リアルタイムでFFTだとレイテンシーもだけどブロック間の繋ぎがどうなるんだろ
436:デフォルトの名無しさん
07/04/06 13:31:52
>そのソフトの詳細
今時のPCの音楽制作環境のことまるで知らないの??
コンボリューションリバーブなんかはここ数年流行っててすでに一般的。たくさんあるぞ。
「コンボリューション VST」とかでぐぐってみなはれ
437:デフォルトの名無しさん
07/04/06 14:05:58
>>436
こういうのってリアルタイム入出力できるの?
438:デフォルトの名無しさん
07/04/07 00:06:50
>>435
ブロック間のつなぎはoverlap-and-addでやるだけなので、大丈夫。
439:デフォルトの名無しさん
07/04/07 07:49:56
>>437
DSPプログラミングやってて、今時そうゆうの知らないことのほうが驚きですよ。
音楽制作と無関係な業界でやってる技術者だったりすると案外そうゆうもんですかね。
「DSP」っていう言葉も昔は主に専用チップ、Digital Signal Processorのことを指していたけど、
汎用PCによるリアルタイム処理が台頭してきた今は、
意味が広がってデジタル信号処理全般、Digital Signal Processingというニュアンスですよ。
440:デフォルトの名無しさん
07/04/07 08:12:27
FIRネタの書き込みは、どの板も具体的な話が欠落してるなw
厨?
441:デフォルトの名無しさん
07/04/07 08:18:37
>440
単純に大量のかけ算するだけなら簡単だが、
FFT応用するとかいうと詳しい人なかなかいないんでしょ。
そうゆうおまいは?
442:デフォルトの名無しさん
07/04/07 08:23:46
>>441
それも既出。
次ページ最新レス表示スレッドの検索類似スレ一覧話題のニュースおまかせリスト▼オプションを表示暇つぶし2ch
4937日前に更新/170 KB
担当:undef