2012年09月プログラム69: サウンドプログラミング5 (666) TOP カテ一覧 スレ一覧 2ch元 削除依頼
C言語なら俺に聞け(入門編)Part 109 (392)
Cygwin + MinGW + GCC 相談室 Part 6 (945)
Perlについての質問箱 56箱目 (707)
国産オープンソースDIコンテナSeasar2 その16 (497)
<XML総合 part="3"/> (756)
MVVMについて語ろう (384)

サウンドプログラミング5


1 :2009/01/11 〜 最終レス :2012/10/29
音のプログラミング処理について語りましょう
各エフェクタの組み合わせとか、
プログラミング外の話題はDTM板の方がいいよ
サウンドプログラミング4
http://pc11.2ch.net/test/read.cgi/tech/1185340076/
サウンドプログラミング3
http://pc11.2ch.net/test/read.cgi/tech/1145573675/
サウンドプログラミング2
http://pc8.2ch.net/test/read.cgi/tech/1091054082/
サウンドプログラミング
http://pc5.2ch.net/tech/kako/996/996171508.html

2 :
用語を統一するために
リアルタイム
 バッチ処理の対語で、ゼロレイテンシの事ではない。 
 遅延はあっても途切れずに処理する事をいう
レイテンシ
 ADCからDACまでにかかる時間の事だったり
 DSPの掛け算なんかで命令から実際に答えが出るまでの命令サイクル数の事だったり
DSP
 デジタル・シグナル・プロセッサ の場合は信号処理用のMPUの事
 デジタル信号処理の事を言う場合もある

3 :
あげ

4 :
音でプログラミングなのかと思った

5 :
ディレイってどうやって作ればいいですか?

6 :
アフリカへ行き部族間対立を煽り負けた者たちを欧米へ拉致る

7 :
>>5
バッファ領域と、バッファの先頭をさすポインタを用意して、ポインタをぐるぐるまわして、読み出しと書き込みをする。

8 :
ディレイタイムとかミックス量とかそういうパラメタはどうするんですか

9 :
出力を一定時間遅延させて(ディレイタイム)一定量掛けて(ミックス量)加算すれば終わりなんじゃないの

10 :
ho

11 :
>>9
入力信号列をx[n]としたとき、y[n]をどう計算すればいいでしょうか?
512サンプル等ずつで計算するんでしょうか?

12 :
>>11
たとえば y[0...n] と、ポインタ p を用意するだろ?
バッファに詰めるのは、y[p] = x; p++; if(p>n)p=0; を動かし続けりゃいいだけ。
取り出すのは、pからディレイタイムに応じたぶんだけ前の部分。y[p-サンプル数]な。

13 :
インパルス応答との畳み込みとかいう事は考えなくていいということですか?
その演算が畳み込みになってるんですかね?

14 :
畳み込み演算を使ってディレイを実現するプログラムを書いてみなよ
そこから0との掛け算の部分を取りのぞいたら>9や>12と同じものが完成
ディレイは文字通りある時間後だけに応答するわけで、畳み込みする間でもない

15 :
>>8
おれはバッファをポインタでぐるぐる循環させて、
循環バッファか(考え方ではFIFOバッファ)
でバッファの長さがディレイタイム
バッファに残すレベルがディレイの音の大きさ
で、2週目以降バッファに書き込むとき前のも
一定割合でミックスしたらフィードバックディレイ
ってやってた

16 :
そういうDSPのソースコードあるとこないかな?

17 :
>>16
そういう?
ディレイだったら俺のだったらあげるけど。
理論書いてあるとこはあるけどね
ライブラリはどこでもありそうだけどね
おれは使わないからしらねけど

18 :
詳細にアルゴリズムを教わっても組めない人は、プログラミングに向かないと思う。
ま、組めない奴は
http://www.musicdsp.org/
でも行け。

19 :
今度はアセンブラのソースが無いとか言い出しそうな勢いだな。

20 :
>>17
amp = 0.5;
delaytimenum = snd.fsamp * 0.3;
rptime = 2;

for (int i = 0; i < snd.num; i++)
{
sndout.s[i] = snd.s[i];

for (int j = 1; j <= rptime; j++)
{
int n,m;
m = (int)((double)n - (double)j * delaytime);

if (m >= 0)
{
sndout.s[n] += pow(amp, (double)j) * snd.s[m];
}
}
}
こんな感じですかね?17さんのも参考にしたいので見せていただけるとありがたいです
>>18 参考にしてみます

21 :
       //
     /  /   パカッ
     //⌒)∩__∩
    /.| .| ノ     ヽ
    / | |  ●   ● |     
   /  | 彡  ( _●_) ミ  まピョーん☆
   /  | ヽ  |∪|  /_
  // │   ヽノ  \/
  " ̄ ̄ ̄ ̄ ̄ ̄ ̄(..ノ

22 :
ディレイって、単に音が遅れて聞こえるだけじゃなかったのか。

23 :
アナログディレイみたいにハイ落ちを再現したりするとめんどうだけどね

24 :
マイクインやステレオインからリアルタイムに波形を取得する関数ってあるんですか?

25 :
>>22
そうだけど、それを現在のに加算すると
効果が得られる。
時差あるから周波数特性がギザギザになる。
>>20
delayタイム以外は直に書き込んであるけど…
一個サンプルを入れると一個返ってくる見たいな
感じで作った。
//delaysample=delaytime(ms)*サンプリング周波数/1000
int delay1(int in,int delaysample){
static int delaybuf[20000];
static int delaycousor=0;
if(delaycousor>=delaysample)delaycousor=-1;
delaybuf[++delaycousor]=in;
return(delaybuf[delaycousor]*0.75+delaybuf[((delaycousor+1>delaysample)?0:delaycousor+1)]*0.25);
//return(delaybuf[delaycousor]*0.75+delaybuf[delaycousor+1]*0.25);

}//func end

26 :
うーむなんかこのスレ新しくなるたびに同じこと繰り返してるよな。
どっかに過去ログまとめたほうがいいかね。

27 :
>>26
うん

28 :
プログラムの勉強をするなら動画圧縮か音声圧縮がいいということでサウンドプログラミングを始めたんですが
全く音の知識は無いんですが、周波数を変更する場合の存在しない中間サンプリング点を打つ場合
直線上に打つのは酷いってのはわかるんですが、補間で曲線上に打っても同じぐらい酷いと思うんですが
これはどうやって打てばいいんですか?

29 :
>直線上に打つのは酷いってのはわかるんですが
ひどくない
たとえばフーリエ変換して周波数成分を欲しい領域に移動して
逆フーリエ変換すれば得られる等

30 :
過去スレでよくフーリエ変換って出てくるので知ってはいるんですが
あれって一定の範囲内ってのがいいかげんで、
しかも途切れが含まれなかったり単音じゃないと酷いと思うんですが
ほんとにこれが主流なんですか?数学と無理やり抱き合わせるんじゃなくて
音専用の予測アルゴリズムとかはないんでしょうか?

31 :
>>28
中間点をとるっていうのは
__ ̄ ̄__ ̄ ̄

___― ̄ ̄ ̄―___― ̄ ̄ ̄
みたいになるっていう意味でしょうか?

32 :
バイリニア補完とかバイキュービック補完とかガウス補完とかシンク補完とかの話?
リアルタイム性の必要な処理なら、足して2で割るのもよく使われるよ。

33 :
>>31
そうです。
>>32
いやニュートンとかスプラインのことをいったんですが、どのみち音に特化してなければ同じですが。
足して2で割るって酷くないですか?間が飛びぬけて山谷になってるかもしれないのに
それって意外な事実ですよね。実際変換ソフトなら全部似たり寄ったりだと思って使ってました

34 :
>>33
あなたがするべき事は実際に大量のデータで統計を取る事だな
音情報である以前にスピーカーを振動させるための電圧である事も考慮しつつ

35 :
>>34
なんか英文を直訳したような文章だな

36 :
>プログラムの勉強をするなら動画圧縮か音声圧縮がいいということで
これの根拠が分からない。ファイル圧縮ならまだ一般的な感じもするが。

37 :
シャノンからやり直せ。

38 :
>>33
サンプリング定理

39 :
>>33
速度を気にしないなら、周波数領域に変換してから間を埋めろ。

40 :
いっつも思うけど、周波数領域に
変換すると、時間分解能みたいのが
ゆるくなるから音質悪くなる希ガス

41 :
>>40
DCT自体は可逆だぜ。
速度やらサイズやらのために細かい部分を捨てることが多いだけで。

42 :
>>41
可逆なのは無限に加算したときだけじゃないの
普通は切り捨てるからそこで音質落ちるんだよ
程度問題だけど人間の耳で分からないレベルで
気にならなければOKでしょ

43 :
音にDCTしてもなぁ…

44 :
>>42
扱うのはデジタルデータなんだから無限に加算する必要なんざねーよ。

45 :
てことは、かなり細かく分割して周波数領域に
変換するってこと?

46 :
ウェーブレットでやれ。

47 :
WDM Kernel StreamingをASIOでラッパーするドライバを作ってみた
AsioKs
http://fanzo.real-sound.net/iCubicProject/

48 :


49 :
DNAはやくリリースされないかな

50 :
DirectNoteAccess?

51 :
ディレイとエコーの違いが分からない orz
ディレイは少し前の入力値を、現入力値に加算
エコーは少し前の出力値を、現入力値に加算
という理解で合ってるのかな・・・

52 :
エコー=リバーブ?

53 :
エコーはこだまだろ
やほーーー、yahoo...

54 :
ディレイもエコーも同じだよ

55 :
俺も>>54と同じ意見。 ディレイ=エコー=やまびこ、で、リバーブが風呂場で音が響く感じ。

56 :
俺の認識では、エコー=風呂場の響き だな。 

57 :
>>56
じゃあ、リバーブはどう認識してるの?w

58 :
エコー
* (ギリシア*kh*)ギリシア神話のニンフ。ヘラの怒りを買って他人のことばを繰り返すことしかできなくなる。ナルキッソスを恋したがその愛を告げられず、苦悩の果てに声だけ残り、こだまになったという。
* (英echo)
1 こだま。やまびこ。
2 残響。
国語大辞典では、↑だそうだよ。
>>56の風呂場でヤッホーと叫ぶと、2、3秒してからヤッホーが戻ってくるのか?w

59 :
リバーブと風呂場は残響というか壁の反響音だよな

60 :
だから、教会やコンクリートの部屋や洞窟の複雑な反射音を小さな機械で再現しようとしたのがリバーブなんだよ、ばか。

61 :
ディレイは純粋に遅らせるだけ ドライとの合成は別問題
リバーブは残響
リバーブの実装方法の中にはディレイを用いるものもある

62 :
だから、ディレイ=エコー=やまびこのプログラムは簡単だと思う。
パラメーターは、原音にたいし、何秒後に何回返すか、音質をどう変化させていくか、音量をどう変化させていくか、
ぐらいしかないと思う。
リバーブは、原音にたいし、0.01秒後ぐらいから反射が始まって、全体的にワオ〜ンという音を作らなければならないから難しいと思う。俺は全然わからないw

63 :
仮にリバーブが出来たとしても、リバーブをかけた時に、聞く人が心地よくなければダメだからむずかしい。
リバーブの製品でも「これ風呂場リバーブじゃん」ってバカにされるからね。

64 :
スプリングエコーって言うのあるじゃん。
あれは山びこじゃなくて、風呂系の響きだよな。

65 :
風呂場で聞けばいいじゃないのもう

66 :
おまいらちょっとはググったらいんでないか
エコーはフィードバックディレイだ
リバーブはディレイタイム(レベルも?)のばらばらな
無数のディレイを加算して再現したりしなかったり
いろんな方法があるみたい
>>64
スプリングリバーブは、昔アナログのころ
バネのある空間に音を飛ばして戻ってきた
音をリバーブとして(ry

67 :
バネのある空間って何だ

68 :
http://gomente.blog.so-net.ne.jp/2007-10-08

69 :
等ラウドネス曲線を扱ったプログラミングがしたいのですが、
調べた限りグラフばかりで、グラフから読み取るのは精度的にも問題ありそうなので、
周波数毎のゲインの数値データが欲しかったりします。
1) Web等で数値データとして配布されていますか?
2) もしなければ下記の仕様書の購入を検討するのですが、
そもそも仕様書自体には数値データは含まれているのでしょうか?
ISO226:2003 http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=34222

70 :
>>69
でかい本屋で立ち読みできるからいってみたら?

71 :
>>71
なるほど、その手が。
ありがとうございます。早速行ってみます。

72 :
あげ

73 :
>>72
そんなさがってた?

74 :
うん、もう海底まじかだったよ

75 :
>>6
それはドゥレイだろ!

76 :
>>75
超遅レス乙

77 :
再生速度の変更ってどうやればいいですか?

2 3 4 5ってデータがあったら
2 2 3 3 4 4 5 5にしたらいいんですか?これで再生速度50%?

78 :
>>77
やってみるといいよ

79 :
>>77
こんなん
23456789   ←6〜9をフェードアウト
   23456789←2〜5をフェードイン

80 :
波形はそのままでサンプリングレートを下げるだけ

81 :
それだと音程も下がるよね

82 :
補完すればいいんじゃね

83 :
>>77
ttp://toragi.cqpub.co.jp/Portals/0/backnumber/2009/01/p202.pdf

84 :
すみません質問ですが、Mpeg-4の規格のドキュメントってどこかにないでしょうか。
mp4の音と映像を分離したいと思っているのですが。

85 :
ttp://www.apple.com/jp/quicktime/technologies/mpeg4/

86 :
mp4のdemuxくらいなら俺だったらmp4boxのソースを参照しちゃうな
ライセンスはLGPLになるが

87 :
>>83
おー、それ買ってみた
今度よもと

88 :
ImageMagickの音版みたいなツール群ってありませんか?

89 :
具体的に、何ができることを期待している?

90 :
>>89
ノーマライズしたり無音部分を取り除いたり
簡単な帯域通過フィルタができたりするコマンドラインツールです

91 :
>>90
つ sox

92 :
>>91
まさにこんなやつです!
さんくす

93 :
winXP, VC++2005 でサウンド入出力プログラムを作っています.
SDK,低レベルAPIを使っています.
入力,出力共にマルチバッファリングを行っているのですが,
入力と再生の間に,バッファ数に従う遅延が生じてしまいます.
体感では,(1バッファに録音する秒数 * 用意したバッファ数)秒
の遅延が生じていると思われます.
リアルタイムに近い動作を実現したいため,
1バッファに録音する秒数(RecSEC)を短くしています.
現在の設定では RecSEC = 0.005 [sec/buffer] です.
バッファ数が少ないと音声がブツブツと途切れてしまいますが,
バッファ数を増やす事で解決しました.
これで遅延量が少ない動作が実現できたと思っていたのですが,
RecSEC = 0.1 として実行してみたところ,約0.1[sec]の遅延を期待していたのですが
約(0.1*バッファ数)[sec] という大きな遅延となってしまいました.
ソースコードをアップしましたので,解決方法をご教授願います.
waveInStart の実行位置を変えてみる等色々とやってみましたが
よくわかりませんでした.
pass: sagehoge
ttp://www2.uploda.org/uporg2074476.txt.html
アルゴリズムによる遅延を解消したいです.
よろしくお願いします.

94 :
>>93
遅延云々以前に入力と出力を同期させてないように見える
バッファ単位の入力完了イベントでたった今読み取ったバッファを
出力にまわす、という処理をしなくてはならないのに、
入力と出力を同時に走らせてタイミングは運にまかせてるから
録音よりも再生が先行してたまたまバッファまるまる1周分の遅れ
が生じているのでは
waveXXXは使ったことないので推測でしかないが

95 :
InバッファとOutバッファを共有したいのは分かるが
別々に用意してコピーする方がいいかもしらん

96 :
別に分けた所で割り込み間隔が短いと負荷時にあっさり逆転する。
まー、デバイスによるのかもしんないけど、
waveIn/waveOut系は互いに同期取ってるわけでも無いし保証も無かったと思うから
一番短い理論上可能な「1バッファ分のレイテンシ」すら難しいと思うよ。

97 :
>>93
頭が悪すぎてハナシにならない。

98 :
コテハンでいきなり罵倒か。NG対象にしてくれといわんばかりだな

99 :
基地外参上ってアピールしてるんだろ

100 :
>>94
私自信 wave*** を使い始めたばかりなので
(それが免罪符だとは考えていませんが)
よく分かりません.検討致します.
>>95
ありがとうございます.
それは何故でしょうか?
>>96
「1バッファ分」が理想的ですが,
用意したバッファ分のレイテンシとなる事が避けられたら満足です.
>>97
解決策が分かるのですね.
お暇な時にアドバイスをお願いします.


101 :
WinXPで音楽のテンポを変更する処理を実装したいです。
音楽が入ったWAVファイルの音程を変えずにテンポを変えたいです。
普通はどのように実装するものでしょうか?
WAVEFORMATEX のサンプリングレートを変更するとテンポは変わりますが音程も変わってしまいます。

102 :
タイムストレッチとかそのへんのキーワードでぐぐってみれば

103 :
音程を変えずにテンポ変えるのって難しいよね

104 :
単純に考えればテンポを下げるときは波形データを間引きし
テンポを上げるときは波形データを2倍した後間引きするとか
音質は保証の限りではないが

105 :
http://floor13.sakura.ne.jp/book03/book03.html
http://nis-ei.eng.hokudai.ac.jp/~aoki/laboratory04.html

106 :
スレ毎に同じ質問が繰り返されてる気がするw
テンプレ化か、FAQとサンプルソースのwikiとかあった方がいいのかねぇ

107 :
テンプレが増えてきたら、wikiあると便利だろうね

108 :
スレ毎どころかスレ内でも繰り返してるぞ
>>101>>77-83 と同じだろ

109 :
だな。ろくに知りもしないのに見当違いの回答しちゃう人が混ざってる点も同じ

110 :
じゃ正しいソースください

111 :
>>101
タイムストレッチはここの説明が分かりやすいかもな。
実装したことないけどw作ったらUPよろw
音声再生速度変換 : もっとゆっくりしゃべって!
http://blogs.msdn.com/windows_multimedia_jp/archive/2009/03/04/9458418.aspx

112 :
>>110
つ105

113 :
>>105って
200Hzの音を2倍速にするとき
10msに一度30万ステップの自己相関するん?
リアルタイムだと厳しそうね

114 :
???

115 :
>>113
そうしないと元の音との互換性が低くなるだろ

116 :
>>113
ディレイっぽく聞こえるのを低減させるために
オーバーラップさせる時間を周期性としてる
周期性を求めるのに自己相関使ってるのは
FFTに比べ低音を考慮したときの精度がいいからとか
実装が楽だからとかじゃね

117 :
>>101
それって結構難しいのよ
論文読むのがいいかなぁ…

118 :
ttp://nis-ei.eng.hokudai.ac.jp/~aoki/laboratory04.html
7.実験6:再生速度の制御
↑で十分じゃん

119 :
聴いた感じでは十分とは言いがたい

120 :
単音ならまだしも
音楽となるとMIDIのようなソースレベルでテンポを変えないと無理だろ

121 :
そこをなんとかするのがサウンドプログラミング

122 :
適当な区間ごとに離散フーリエ変換で周波数解析して
それを合成すればなんとかなるかもしらん

123 :
>>122
それはむずかしい
un4seenってとこのライブラリ
たしかオープンソースの再生速度変更が
けっこう優秀。
WMPより優秀と思う

124 :
サウンドプログラマーな先輩方にお聞きしたい。
WaveTone(ttp://www.vector.co.jp/soft/win95/art/se421780.html)
↑このソフトはどういった変換でスペクトル算出しているのか見当つきますでしょうか。
当方、FFTで似たようなプログラムを組んでみたのですが、低音域の周波数分解能があまりに悪く、
実用とはほど遠い結果になりましたので、先輩方のお知恵をお貸し頂きたいです。
何卒よろしくお願い申し上げます。

125 :
FFTのポイント数を増やすのはダメ?
ゼロ詰めしたりフレーム長を増やしたりしてね.

126 :
>>124
・FFT結果から山を見つけて頂点を補完
・各音階に属する周波数成分で平均化(画像縮小アルゴリズムの面積平均法みたいな感じ?)
サイトの画像見る限りでは低音の精度は粗いからFFT後になんか処理してると思われ

127 :
ローパスフィルタで分けてから低音域だけ取り出すとか

128 :
>>123
みつからないけどどこ?

129 :
すみませんタイム(ピッチ)シフトを実装したいのですが、
質問させてください。
速度とともにピッチが変更されてもかまわないのですが、
たとえば98%遅くするなど、単純な整数比ではない場合はどう実装すればよいのでしょうか。
アップサンプリング/ダウンサンプリングの手法ではこれは実現できないのでしょうか?
80%〜120%の間で、速度を変更したいです。
よろしくお願いします。

130 :
>>128
ttp://www.un4seen.com/
ttp://www12.plala.or.jp/mojo/Delphi/delphi6-Z.html
タイムストレッチはたしかbass_fx
>>129
>>118でも見れ
98%の速度にするには、100×nサンプル再生した後
2×nサンプル戻った位置から再生する

131 :
ピッチも変わっていいならTimidityのソースを見てみたら?

132 :
ほんとは間引く前にローパスフィルタだっけ?
あれかけないとノイズがでることがある

133 :
いらない

134 :
FIRフィルタをそのまま実装するのと、
同じ係数で短時間FFTしてオーバーラップするのとは
同じ事でしょうか? 異なる場合は、どのような点が異なるのでしょうか?

135 :
>>134
http://infoshako.sk.tsukuba.ac.jp/InfoRes/jdoc/MATLAB5/jhelp/toolbox/signal/fftfilt.html

136 :
>>135
ありがとうございますー

137 :
VSTでイコライザを作ってます。
RBJ Audio-EQ-Cookbook見ながらピーキングフィルタを使ってシングルバンドのEQらしきものは実装できました。
これをLOWとHIGHの2バンドにしようとしてるのですがうまくいきません。
この場合、どんなふうにコードを書けばいいのでしょうか?

138 :
ピーキング2つって意味ならIIRフィルタ2つ作ってに直列に通す
トンコロ的な、2~3バンドで全体を調整できるようなものにしたいなら
シェルビングタイプ2つにして直列に通す

139 :
>>138
ありがとうございます。
ピーキング2つを並べてLOW,HIGHの順でやってるんですが、
LOWの効きがシングルのときよりかなり弱く(効いてない?)なってしまうんです。
「直列」っていうのをちゃんとプログラミングできてないんですかね・・・

140 :
ASIO対応の録音再生ソフトって、素人では作れないですか?

141 :
そんなことないでしょ、どうしてそう思った?

142 :
商用ソフトしか存在しないから。
なんか、ASIOSDKがあるらしいので、入手できた。

143 :
どんだけ無知だよ。。。

144 :
>>130
亀ですみませんが、ありがとうございます。
100*nサンプルを再生バッファに入力した後、2*nサンプルもどってバッファを入力する処理を実装してみたのですが、
再生時にノイズが乗ってしまいました。
波形の接続部分がきれいに合わないためだと思うんですが、
これにローパスフィルタをかければノイズは消えるものなのでしょうか。
それとも僕の方法がまちがっていますか?
こわれたテーププレーヤーのような効果をデジタルで実装するのに他に何か有効な方法はないでしょうか。

よろしくお願いします。


145 :
>>144
いきなり切替えたらノイズが出るので、
フェードアウト・フェードインさせながら切替えないといけない
http://floor13.sakura.ne.jp/book03/book03.html
のchapter11.zip

146 :
クロスフェードってやつな

147 :
>>145
おおお、ありがとうございます。
なるほどお, この本買って読んでみます。

148 :
>>135
便乗ですまんけど、
FFTは暗黙に処理範囲の両端が繰り返すけど、FIRだと繰り返さないよね
ブロック処理ってそのあたり大丈夫なのかな?

149 :
質問が曖昧でなにが大丈夫なんだ?
FIRだと切れ目無くできるからいいけど
FFTはぶった切るから窓関数+最後
オーバーラップが必要ってことか

150 :
FIR相当の処理をFFTでやると、両端がループしてるから区間の最後の方の
計算値が区間の最初の方に影響するってことだろJK

151 :
周波数成分いじって逆FFTしてまた窓かけてオーバーラップするからいんじゃね?

152 :
分かりやすくするために極端な例だけど、例えば前半全てゼロ、
後半ピンクノイズみたいな波形があって、それをFFTして周波数成分を
操作して戻すと、ゼロだった前半部に微小な波形が出るよね。
要するにプリエコー、ポストエコーなんだけど、
これはオーバーラップだと解決できないと思うんだ。

153 :
>>152
FFTは時間成分ないんだから当たり前

154 :
>>153
んと、解決できない、でOK?
とすると、>>135は無効ってことになるけど・・・

155 :
感覚でものを言っちゃいかん 数式で検証してくれ

156 :
Androidでサウンド系アプリ作った人いる?

157 :
>>149
一回の計算についてはFIRもFFTと同じくブロック処理以外の
何ものでもないのだが? 
どちらも対象の有限長のブロック以外は全然計算対象に入っ
ていない。
FIRの代わりにFFTを使う時、FIRでの場合と同じように1サン
プルづつずらしてFFTを行い、その結果を正しく評価すれば
FIRでの場合と同じ結果が得られるんじゃない?
ただ、それだと普通にFIRやるよりも計算量が増えるので、
それをひっくり返す手法としてオーバーラップ法があるの
だと理解してるが?

158 :
>>157
てことは、オーバーラップは単に計算量対策で、
FIRとFFT+オーバーラップは本来は代替不可能ってことか。

159 :
>>157
一回の計算についてはプログラミング上
ブロック処理にしてもしなくても
出力はFIRならいっしょだからそれは考えないとして。
FIRとFFTの違いはサンプル数の違いがでかくないか?
FFTはサンプル数でかくしないと周波数領域で操作できる
周波数ステップ荒くなるし
FIRは少なくてもある程度できる。
サンプル数大きくするとそれだけFFTの計算に入れる時間が
大きくなるから時間分解能下がる
FIRはリアルタイム処理だから時間分解能最大。
それでサンプル数が一緒での議論だと、
FFTは実際(データが何かにもよるけど)窓関数とかかけなきゃ
だめだからそれだけデータ量そこでへっちゃうから、
最終処理後のデータの品質さがる
だから目的に合わせて選べばいんでは


160 :
>>159
いまいち良くわからんのだが、、
>FFTはサンプル数でかくしないと ... FIRは少なくてもある程度できる。
同じステップ数として、FFTの時間領域で、FIRフィルタの
設計上のカーブを各点で取ったフィルタ処理は違うもの?
違うとすればどの辺りが?
> サンプル数大きくすると ... 大きくなるから時間分解能下がる
時間分解能はサンプリング周波数で固定だと思うけど、、、
短時間FFTのオーバーラップ回数が少なくなるってこと?
> FFTは ... それだけデータ量そこでへっちゃうから、
データ量は減らないと思う。

161 :
>>160
FFT/FIRの基本的な仕組みすら理解出来てねーだろお前。
159の説明は波形処理の基礎だぞ。
まずは自分で調べて考えろ、なんでも聞いて済まそうとすんな。

162 :
>>161
ただ罵倒するだけのレスは無価値ですよ、いつもの方。

163 :
>>160
あの、
ここでの説明だとあれだから本買ってきた方がいいよ。
最初の方は強いて言えば違わないけど、
それぞれの癖とか特徴とかできることできないことあるから
目的に応じたいい方をえらべよ
二つ目は
>サンプル数大きくするとそれだけFFTの計算に入れる時間が
>大きくなるから時間分解能下がる
これはFFTの時間分解能だから。
160が言ってるのは多分サンプリング定理とかそこら辺の
波形のデジタル化の時の時間分解能の事をいってるんかな?
FFTの原理とか時間領域-周波数領域のサイトとか本とかみればわかると思うけど
みつめ
何バイトとかのデータ量はへらないけど、なんというか削ってるんだから論理的な
データ量は減るよね?
たとえばwav->mp3圧縮の時みたいな感じで
たとえばデータを波形ととらえて周波数領域に変換して周波数高い一部分を少なくして
時間領域に戻してもバイトは変わらない。でも何か(なんらかの情報)は減っている。

164 :
>>163
うーん……難しくていいので正確に書いてもらえると嬉しいです。
理解してるとかしていないのかという問題よりも、163の説明の中の
一つ一つの用語が式とか定理のうち具体的に何を指しているのかが曖昧すぎて分からない。
> FFTの時間分解能
>>160の時間分解能は指摘の通りデジタル化の際の時間分解能です。
で、説明だとFFTという変換自体にに時間分解能ってパラメータなり特性が存在するんですよね?
> データ量
窓かけの周波数特性でサイドローブが出る話ですよね。
歪みは出ると思いますが、それが情報が減っているということ?

165 :
>>159
>FFTはサンプル数でかくしないと周波数領域で操作できる
>周波数ステップ荒くなるし
>FIRは少なくてもある程度できる。
そんなことない。
「NタップのFIR」は「サイズNのFFT+周波数領域での積和演算」
と等価でしょ?

166 :
>>165
「ある程度」だから実用性を考えての
ことだよ
小さいタップ数で同じ事ができるんだったら
小さい方がいいだろ

167 :
>>164
一般的なFFTの話だが
FFTはサンプル数を大きくすれば周波数分解能はあがるが、
それだけ時間領域でも…
たとえば音楽だと22050hz、4096FFTだと一回のFFTで
4096サンプル=0.185秒分のデータが必要になる
音楽だと0.185秒だとテンポの速い音楽だと音符が2個分
含まれていることもあるかもしれない。(極端な話)
上のFFTだと5.38hzごとの周波数領域のデータだ。
このようにFFTではサンプル数を大きくすれば得られる周波数データの
hzの間隔は少なくなり詳しく得られるが、それだけたくさんの時間を
計算に組み入れなければならないので、いらないデータも含まれるかも
しれない。sin波だったらずっと同じだからいいけど、PCMなんかだと
刻一刻と周波数成分が変わっていってるので(音楽なので刻一刻と
かわらないとおかしいが)一回の計算にいれる時間は少ない方が
その時点の周波数は正確に表れる。
この文を読めばFFTの時間分解能、周波数分解能の意味は
なんとなくわかるだろ

168 :
>>167
いやそれはとっくに分かってるんだが・・・
ピッチ検出ならゼロクロスなりケプストラムなり使うし。
で、そもそもの疑問である
>>163
> 最初の方は強いて言えば違わないけど、
これをkwsk

169 :
>>166
>小さいタップ数で同じ事ができる
俺はそんなことは出来ないと理解してるのだが?

170 :
便乗レスだけど、
>>168
NタップのFIRをFFTで実装しようとすると時系列データもN用意して
Circular ConvをConvにするため最低Length=2N+1のDFTを行う必要がある。
(信号分析しないから窓掛けしないとする)
DFT自体は丸め誤差とかを除いたら単なる座標変換だから周波数領域での掛け算も
時間領域の畳み込みも等価なんだけど、フレーム単位で処理する必要があるから
出力時には最低Nサンプルの遅れがある。
反面、FIRだと過去Nサンプルのバッファを用意して置けば新しいサンプルが入ったときに
バッファからフィルタの出力をその時点で得られる。
同じ性能を発揮するのに必要なタップ数が変わることはありえないし、
時系列でFIRを処理するから周波数分解能が云々とか、それを座標変換した
領域で作業するから周波数分解能が云々ってないし、考慮する要件は数理的なものよりも
処理時間やFFT-IFFTするオーバーヘッドや誤差への許容に関すること。
更に言えば、Portaudioみたいに最初にデータをバッファにためてバッファがいっぱいになったら
コールバックを呼ぶようなやつだったら、正直FIRを時間ドメインでやろうが周波数でやろうが
変わらない。
リアルタイム性を重視するフィルタだったらFIRを時系列で畳み込む方がいい場合もある。
特にタップ長が短い場合。

171 :
質問いい?
VistaでWin32APIのmidiOut〜系でMIDIを出力しているんだが、
どうにも我慢ならないほどの遅延が発生する(200ms程度)。
出力先をデフォルトのMIDIマッパーの代わりに、Timidity++→ASIOにしても同程度の遅延が発生するので、
多分APIに問題があるんだと思う。
そこで、他のAPIに乗り換えようかと思ったんだが、
DirectMusicは消滅した上に64bitアプリで使えないようなので、
他の選択肢が欲しい。
なんかないかな?

172 :
MIDIならしょうがない

173 :
しょうがないのか。 適当な音源自前で実装するか……サンクス。

174 :
Timidity++側、ASIO側にバッファがあれば同様の遅延は発生するだろ
APIを疑う前になぜMIDIインタフェース+外部音源の組み合わせで試さないのか不思議だな

175 :
>>171
少なくともXPまでの環境でmidiOutで200msecも遅延するとか聞いたこと無い
Vistaのドライバとかの問題だと思うが、ソフトMIDI音源とかで試してみた?

176 :
>>174
外部音源とか持ってねーよwwww
Timidity++のGUIからmidiファイルを再生してみたけど、たぶん遅延してない。
>>175
全く違うハードウェア構成の2台のVistaで同様の遅延が発生してる。
で、さっきXPマシンで試験したけど遅延しない。
何ヶ所かの英語フォーラムで、Vistaだと遅延が発生するという報告があるのよ。

177 :
いや、MIDIファイルの再生じゃ遅延してるかどうかなんて分からんだろう・・・
なんにせよmidiOUtの問題じゃないと思うんだが
VISTA環境があれば試すんだがなぁ

178 :
>>173には同意してるかんね

179 :
ソースが公開されてるDAWやシーケンサがMIDIをどう発音しているか確かめたら?
あとTimidity++自体に遅延があるからASIOを使ってもMSGSより遅いぞ

180 :
ogg vorbisのエンコードについて詳しく書かれたサイトありますか?
公式見ても初期化部分しか書かれてなくて何をすればいいのかすらわからん

181 :
>>180
oggのlibならexamplesディレクトリに encoder_example.c があると思うけど、それじゃだめなん?

182 :
ogg vorbisのエンコード上手くいかない・・・

183 :
自作のフィルターを組んでメモリ上に全てのデータを置いてランダムアクセスで
メモリ上を飛び回って処理をしているのですが、音源の時間に比べて20倍の処理速度が掛かります。
DSPとやらを使えばもっと高速にできるらしいのですが、どうやって使えばいいのでしょうか?
Google先生に効いてもネット上に資料はあまりなく、困っています。
VC++9.0SP1を使ってプログラミングをしています。誰かVC++からのDSPの使い方を教えてください。

184 :
とりあえずどんなフィルタか書かんと
DSPは単純な演算を高速に(あるいは並列に)こなすものだから
処理の種類によっちゃ効果がない

185 :
>>183
どんなマシン使って20倍なのかわからないけど、
最近のPCでそのスコアならアルゴリズムから見直さないとどのみち無理な気が。
一言にDSPっていってもピンキリだし、PCから使うならどこかの評価ボードみたいなの買うしかないんじゃないかな?
本気でDSPに手出すなら開発キット&コンパイラで数十万、仕事じゃないなら個人に販売してくれるかってのも微妙な所。
たぶん想像してるよりもはるかに敷居高いと思う。
波形処理の高速化なら一番お手軽なSIMDに手出してみれば?
モノによっては5〜10倍くらい期待出来る。

186 :
G.722とG.722.1 Cの、GPL/LGPLでないソースを探していますが、どこにありますか?

187 :
誰かにそのソースを渡す
アルゴリズムと定数だけそいつから聞き出して自分で実装する

188 :
そして定数の中にGPLの文字がひっそりと含まれていて自爆するわけですね

189 :
ogg vorbis以外で意匠フリーでブロードキャスト向けの音声圧縮ってありますか?

190 :
189!=186と仮定して、G.722

191 :
結局Speex使うことにしました

192 :
スペアナ作りたいですが、窓掛けしてFFTして絶対値取れば完成ですか?

193 :
いや、表示せんと。

194 :
テキストで吐けば十分
リアルタイムじゃないなら

195 :
すいません。
WindowsXPでサウンドデバイスを2つ以上インストールしているマシンがあるとします。
再生デバイスと録音デバイスにそれぞれ別の物を設定しているとして、
録音デバイスから入力した音声をそのままダイレクトに再生デバイスから出力させることは
できますか?

196 :
OS上の機能では無理だったと思うよ。
プログラム作っていいなら AudioIn → プログラム → AudioOut は簡単に実装できる。
まぁ、レイテンシは発生してしまうけど。
Virtual Audio Cable とか既存のツール使ったらプログラム組まなくても簡単にいけるかな。

197 :
DirectXスレからきました。
DirectSound で再生しながら、
横軸に周波数、縦軸に音量を表すようなグラフを
リアルタイムで描きたいです。
とりあえずWRを再生するところはできてるんですけど、
そのようなグラフを描くにはどうすればいいですか?
一応↓のコードを手に入れたのですが、どういうふうに使えば... ?
ttp://www5.airnet.ne.jp/tomy/cpro/sslib8.htm

198 :
やる気がなければ帰れ。

199 :
>>197
テストアプリ書いてデバッガなりコマンドプロンプトなりに変換結果出してみるとかやってみた?
サイン波形なりを食わしてみればすぐ理解できる

200 :
>>197のプログラムをコンパイルするとkが初期化されてない警告が出るんですけど、
これは0 で初期化して問題ないですか?
あと、iter は何の値なんでしょうか??

201 :
んー、一通り目通せばすぐ気付くだろうに、ホントにやる気ないのな
fft2(), fft2x()のjのforループでkは使われてない→たぶんコピペって k += nmax を消し忘れ
iterはループ回数の演算省略用じゃね? 0渡せば勝手に計算するようになってるだろ

202 :
RolandのVariPhraseってあるじゃん
あれってなにがすごいの?

203 :
>>202
当時のチップの速度でリアルタイムにピッチやらフォルマントやらを操作して、それをもとに音作りできるところ。

204 :
ケプストラムについて教えてください。
n個の時間領域のデータxn(t)をFFTし、
Xk(f)のパワースペクトルを得たとします。(k=n/2)
パワースペクトルの自然対数を取り、IFFTすると思うのですが、IFFTするには
実部と虚部の情報が必要ですよね?パワースペクトルの対数をとったら、虚部が
わからなくなってしまいますよね。
そのところでわからなくて困っています。わかる方教えてください。

205 :
>>204
IFFTは別に虚部がなくてもいいです.
それとスペクトルのkはnのままでいいと思います.
スペクトルは偶関数になってるので,IFFTすれば実数成分(ケプストラム)が求まると思います.

206 :
MMEやDirectSound対応のスペアナソフトやレベルメーターのソフトみたいな音を入力して解析してリアルタイムで表示する系統のソフトって、
半日以上とか1日とか数日とか、長時間起動してると、必ず反応がかなり遅れるようになるけど、それはなぜ?
複数のソフト、いろいろな環境で再現性があるのでOSの問題なんだろうかと思うんですが。
たとえばwavespetcraとかDeskTopLevelMeterとか、他にも山ほどあります。

207 :
システム時計とサンプラ側の時計(たとえば44.1kHz)がビミョーにずれてくのかもね

208 :
ソレ系のソフト以外でも、何でも遅くなってないか?
多分、ただのページングだよ。

209 :
WinVista/VC++expでサウンドプログラミングをしているのですが、
リアルタイム(1バッファ遅延)に入力→加工→出力を行うAPIを探しています。
調べたところWDM?ではカーネルミキサを通す分遅延がありすぎて話にならない
ディフォルト出力ならKernel Streamingが良いと聞きました。
Win32APIのwaveXXXX関数は、関数の内容的にハードウェアに直接アクセスしてるように思えるのですが
実際のところ、Winのカーネルミキサを経由していたりするのでしょうか?

210 :
「ハードウェアに直接アクセス」なんて危険なAPIは基本的に存在しない
waveIn()/waveOut()で遅延がネックになるレベルならPCでの処理は難しいと思うが、
WinAPIよりはリアルタイム処理に向いてると言われるASIO使ってみれば?

211 :
CoreAudioAPI

212 :
DirectX

213 :
>>211
DirectXはミキサ通すはず。
>>212
VistaはCoreAudioっていうんだな。Macかとオモタ

214 :
音程を変えずに速度を変える処理って、100msとかの短い間隔のかたまりで処理するタイプが定番なんですかね。
ゆっくりさせると、響いている様になってしまい良くないです。
NHKテレビで、波形の山を増やすとか言ってたが、
波形の山一個単位(一周期単位)でコピーして増やしたり減らしたりするアルゴリズムを僕は考えていたのですが、実現されていないのでしょうか。

215 :
>>214
ちょうどいい間隔でスキマがうまるならそれでいいだろうよ。
どうせギャップができて似たような音になると思うけど。

216 :
>>214
ピッチ検出の話になるが、ゼロクロス検出の精度が実際微妙ってことを
考えると、似たような理由で何かの障害があるんだと思うよ

217 :
含まれる周波数の最小公倍数な周期、いわゆるf0周期が短く明確なら良好な結果になるが
が、実際の音声は周波数はおろか振幅エネルギーも
時間変動する
よってf0の定義自体がまず困難
少しでもずれがあればパルスノイズが発生(矩形窓の場合)
蛇足だか、なんだかんだで窓関数は有効だよ。
目的に応じて最適な窓関数とオーバーラップ数の設計をすればいいし

218 :
>>214
nhkでそんな話してくれるの?KWSK

219 :
反応速度を優先するならグラニュラー(ディレイを使ったものも一緒)
音質を優先するなら、周波数領域に変換してからリリース部なんかを中心に引き伸ばせ。

220 :
ここの人たちって、お仕事はなにを?

221 :
無職

222 :
マ板でやれ

223 :
自宅警備員

224 :
音関係に詳しいから仕事もそれ関連かと

225 :
だからなにやってんのって話だ

226 :
なるほど、なかなか難しい訳ですね。 ありがとうございました。
>>218
昔の高校情報Aでやってました。

227 :
最近の高校生は信号処理とかもするのか

228 :
うろ覚えだけど昔工房でフーリエ変換習ってた奴もここに居たしな。

229 :
高専なら普通に教えてそうだね

230 :
証明はともかく使いかただけなら工房でも分かる罠

231 :
は?何?それがどうした?

232 :
なんか変なレスきた

233 :
FM合成、もしくはFM変調などについて学べる書籍またはサイトは無いでしょうか?
簡単な波形合成を行うプログラムを作っているのですが、中々FMについて理解が進みませんorz

234 :
「FM音源」と組み合わせて検索かければ解説からサンプルコード、FM音源ドライバのソースまでなんでも見つかんね?

235 :
wikipediaで調べるといい。

236 :
サウンドプログラミングに限らず、離散信号処理で辞典的役割をしてくれるもしくはできるだけ広範囲をカバーした本があったら教えてください

237 :
http://www.google.co.jp/search?hl=ja&q=%E3%83%87%E3%82%A3%E3%82%B8%E3%82%BF%E3%83%AB%E4%BF%A1%E5%8F%B7%E5%87%A6%E7%90%86+%E6%9B%B8%E7%B1%8D

238 :
ttp://www.seventhstring.com/
ここのTranscribe!ってソフトのタイムストレッチ/ピッチシフトがめちゃ精度良いように思うんだけど、
どうやって実現してるか先輩方わかります?

239 :
そんな糞ソフトよりAutoTuneとかのほうが糞精度いい

240 :
ポジティブな形容にも「糞」って付けるものなの?

241 :
ワンピースみろよ。

242 :
着てる

243 :
ワンピース着るような清楚な女は一度も見たことないわ(清楚でなくてもだけど(ワンピース着てる奴に限ってビッチ多いらしいけど(Rだから知らないけど)))

244 :
lisp厨がきたぞー

245 :
WaveOut系APIで、waveOutWriteで送った後のデータ書き換えたらマズいのかな
(waveOutPrepareHeaderで指定したWAVEHDR構造体のlpDataの参照先のデータのことね)
やってみたら一応動作はしたんだけど、これが出来るならWaveOut系APIの遅延も短く出来るよな

246 :
俺もそれやった事あるんだけど、結局資料が見つからずに有耶無耶になってサウンドプログラミングやめた。

247 :
>>245
woWriteの後はデータ管理としてはOS側だろ?
バグ作り込むようなもんだからできるできない以前にやらない
仕様として保証されていない動作に依存するようになるとデバッグが泥沼だよ

248 :
Replaygainを自作プログラムに実装すべく考えているのですが
良く分かりません。教えていただけないでしょうか。
実際、色々調べてみてある程度はわかったのですが、
「Peak Amplitude」があまりよくわからなかったのと、
音量設定の単位がdbになっているので、設定の仕方が難しい、
合わせにくいというところでつまずき、そのままになっていました。
現在わかったことは、ピーク時の振幅(Peak Amplitude)、
トラックごとに音量を設定する値(Radio Replay Gain Adjustment)、
アルバム単位で設定する値(Audiophile Replay Gain Adjustment)
の3項目でタグが構成されていて、これらの値を使って音量をdb単位で調整する、
ということです。
タグの読取りはそれぞれの形式(tta,ape,mp3)で異なるが、
提供されているライブラリを使えば読取りは比較的簡単に出来る。
というところまでは行きついたのですが、
実際に読み取った値からどう処理するかが難しく、
実装するのが難しい状況です。
今考えているのが、勝手にdbの単位を独自の値に置き換えて(0dbが125とか)、
音量を調整すればいいのかも?と思っているのですが、
それにしても、ピーク時の振幅(Peak Amplitude)がよくわからないので、
どう使って良いか悩み、ここでつまずいています。
ご存じの方、教えていただけないでしょうか。

249 :
>>248
全てはdBとリニアの変換くらいは自在にできるようにしてからだ。
Peak Apmplitudeは意味そのまんま最大振幅と思うんだが。最大はmaximumだとか言うなよ?

250 :
dBーリニア変換
dB = 20log(A/B) log:常用対数
(パワーの場合は10log(A/B))
例)
Aが1、Bが10の時AはBに対して20dB落ち(-20dB)
上記のような比を表す他に、dBV, dBu, dBmなど、具体的な単位
(例えば1Vなどの電圧)に対する比を計算し、実際の値を表すこともある
例)
0dBm = 1 mW

251 :
>>249-250
ありがとうございます。
試行錯誤してみます。

252 :
色々な楽器の倍音構成をある程度記載したサイトもしくは書籍などないでしょうか?
ピアノについては見つけられたものの、そのほかの楽器が中々見つけられません

253 :
Peak Apmplitudeについても、何となくわかりました。
曲によって振幅が違うから、その状況を表しているんですね。
それにしても、何故「1」が最大値なんでしょうか。
「1」の基準は何でしょうか?
質問ばかりで申し訳ないのですが、ご存じの方教えてください。
よろしくお願いいたします。

254 :
少しは自分で考えないと相手にされないよ
もうされてないと思うけど

255 :
>>252
自分でスペアナ通せよ。
>>253
Maxが100%=1だと計算しやすいから。

256 :
>>255
本当にありがとうございます。

257 :
適当なGM音源モジュールを買ってMIDIで鳴らして録音
リアルな音じゃなくても、倍音構成を調べるくらいには使えるんでない?

258 :
本当にありがとうございます。

259 :
デシベルの計算式がまったく理解できなくて死にたい
-25dBから-30dBに音量が下がったら振幅値にいくつかければいいんだ…

260 :
まず日本語からだな

261 :
振幅100の正弦波を基準として(これが0dB?)音量が-5dB下がったときの振幅値を知りたいんだ…
説明すらできねぇ…

262 :
-25dBの正弦波を、-30dBの正弦波にしたいって事だよね?
>>250 の逆の変換になるので、この場合、10^(-5/20)を掛ければよいはずです。

263 :
dB = 20log(A/B) log:常用対数
(パワーの場合は10log(A/B))
-25dBから-30dBに音量が下がったら振幅値にいくつかければいいんだ…
-25dBの正弦波を、-30dBの正弦波にしたいって事だよね?
>>250 の逆の変換になるので、この場合、10^(-5/20)を掛ければよいはずです。


264 :
>>262-263
ありがとうございます!まさにコレが知りたかったんです…
教えていただいたことを参考にして
ttp://geocities.yahoo.co.jp/gl/flawtips0/view?.date=20050324
を試してみたのですが、同じ波形を得ることが出来ませんorz
計算は間違えてないと思うのですが…表が誤っているのでしょうか?

265 :
logとかフーリェ級数にピンとこないってことはreal中学生かな?
http://www.geocities.jp/flawtips0/Pic/wav2.html#p14
ここを見ると周波数分布の山の高さがdbと合ってるから表は間違ってないと思う

266 :
まあ特に独学で始める場合は年齢関係なく中学生レベルに見える
質問しちゃったりするしね。どんな分野でも。
育て直しじゃないが、学習のプロセスをゼロから辿り直すわけで。
日本語が中高生レベルに見える点にはあえてつっこまない

267 :
http://www.shonan.ne.jp/~hiro-s/pages/post-tut/fm.html
http://homepage3.nifty.com/sawai/neiro/neiro.html
http://flawtips.ami.amigasa.jp/blog/051230.html
http://www.terawave.net/amane/contents/soundworks/
http://d4.princess.ne.jp/msx/datas/OPLL/YM2413AP.html

268 :
質問する前に少しは考えるなり調べるなりしろよ・・・
検索すればすぐにわかるんだろそんなこと

269 :
>>264
重ね合わせる高周波の位相がずれてるとうまくいかないよ

270 :
はいそうですか

271 :
アー確かに、そういう奴いそうだわ

272 :
>>264
まず試してみたソースを出せ、話はそれからだ

273 :
>>245
違うバッファに用意しとけばいんじゃない?
メモリーのコピー作業はそんなに重くない
とこだよね
書き方によるけど

274 :
まぁ、大抵はめんどくさいから6dBで2倍(-6dBで半分)にしちまうけどな

275 :
-6dbは半分じゃなくて1/2乗だろ。
半分は1/2倍。

276 :
1/2乗は-3dB

277 :
えっ

278 :
馬鹿がいるな

279 :
逆立ちしたら草食性哺R類一種鯨偶蹄目になっちまうな

280 :
ttp://av.watch.impress.co.jp/docs/news/20091117_329581.html
なんじゃこりゃ?

281 :
ものすごくリバーブが掛けられたゲーム音楽CDに発憤して
リバーブ成分を取り除いてみたことはあるな
そこからサラウンドに繋げられたか・・・

282 :
>>276
ばーか、エネルギーは振れ幅の二乗だろ。アホ

283 :
>>282
いつからエネルギーの話になったんだろうか
ああ脳内で世界が固定されちゃってるんですね

284 :
>>274
×>>275
×>>276

285 :
ttp://ja.wikipedia.org/wiki/デシベル
20log10(b/a) = 10log10((b/a)^2)

286 :
20*log10(2) = 6.02 dB
20*log10(1/2) = -6.02 dB

287 :


288 :
Windowsで、ネットワークから受信した音声データを
スピーカーに再生するプログラムを書いてるんだけど
再生の方が速くて困ってる。
具体的には、
20ms間隔で20ms分の音声データをwaveOutWriteで書き込んでるんだけど、
waveOutProcのコールバックが0〜15ms間隔くらいで返ってくる。
waveOutAPIってこういうもんなの?

289 :
yes

290 :
バッファが十分たまれば間隔は落ちる

291 :
DirectSound使え

292 :
そこでWASAPIですよ

293 :
Visual Basic 2005以降 or C#2005以降ならそこそこ開発できるスキルは持っています。
C言語はなんとなくわかりますが,非常に苦手です。
C++はわかりません。
VBでPCMデータをアップサンプリングするプログラムを作った経験はあります。
こんな私にもわかるようなASIO SDKの使い方を解説したサイトまたは書籍などご存じありませんでしょうか?

294 :
無理

295 :
デジタルフィルタがむずかしい。

296 :
「***が苦手です」とか「###が苦手です」って言う人は何が難しくて自分にできないか考えたことはあるの?
それがASIO SDKとどう結びつくかを他人に説明する気はないの?

297 :
山葵?

298 :
Windowsでbeep音だけで音階を作るサンプルコードがあれば教えてよ

299 :
>>298
double cdef[] = {3.0, 5.0, 7.0, 8.0, 10.0, 12.0, 14.0, 15.0};
for (int i = 0; i < 8; ++i)
{
DWORD freq = (DWORD)(440.0 * pow(2.0, cdef[i]/12.0));
Beep(freq, 500);
}

300 :
先越されてしまった。
がんばって作った俺の努力の結晶が無駄に・・・
http://codepad.org/VxXlvVkM

301 :
MMLまで作ったのかw

302 :
4分割多重MML再現したくなったw

303 :
>>300
努力した内に入らないよw

304 :
BASICでbeep文だけで声を鳴らすサンプルコードがあれば教えてよ

305 :
>>300
久し振りに笑うプログラムに出会った
これは面白い
Windowsにこのような機能がまだ残されていたとはw

306 :
何BASIC?

307 :
FFTを勉強中です
基本的な質問で悪いんだけども
周波数ごとの音量ってのは
実部のスペクトル?
それとも実部と虚部から求めるパワースペクトル?

308 :
補足です
パワースペクトルが音量に相当するなら
実部=0、虚部≠0の場合
周波数は無いのに、音量はあるのか?
実部が音量に相当するなら、パワースペクトルの意味ってなに?
とか、よくわかんなくなっちゃったのです

309 :
http://laputa.cs.shinshu-u.ac.jp/~yizawa/InfSys1/basic/chap6/index.htm
アニメで見ると分かりやすいね

310 :
>>309
読みました。
たしかにアニメーションついててわかりやすいですね。
んで、周波数ごとの音量に相当するのは、
パワースペクトルってことですね。
ありがとうございました。

311 :
SIMDなフィルタプログラムの英語か日本語のチュートリアル、どこかにありませんか?CPUには拘りません。

312 :
アップサンプリング時にゼロ補間してもスペクトルが変化しない理由ってなんでしょうか?

313 :
補間のあとのLPFで鏡像になって出てくるスペクトルをカットしてるから。

314 :
wavファイルの合成について相談です。
現在2つのwavファイルを読み込み、データ部を足し算することで「両方同時になっているwavファイル」を作成、出力することができました。
ここで疑問なのですが、16bitWAVの場合、データ部の値は
-32768〜32767
となりますが、2つの足し算なら「int型に変えたあと足して、限界を超えたら丸めこみ、shortの範囲に戻す」すればいいとわかります。
ですが、3つの音を足すとなると、丸めこみを最後に一括してやるか、足すたびにやるかで結果が変わってしまいます。
例:
丸め(30000 + 30000 - 10000) = 32767
丸め(丸め(30000 + 30000) - 10000) = 22767
今はまだ、足す音が3つと決まっているから1単位時間毎にintで計算>shortで吐き出しで問題ないのです。
が、もし「任意にユーザーの選択により次々音を足し算できるツール」のようなものを作る場合
やはり単位時間毎に一旦intとしてバッファを作り、WAVファイルとして出力する際に丸めこむべきなのでしょうか?

315 :
先に個数で割ればいいだろう

316 :
>>315
個数で割る。というのがよくわかりませんが、任意に追加できるため個数はその場その場で定まらないのを想定しています。
例えばAとBを合成して、とりあえずそれを再生。
ユーザーがそれを聞き、「やっぱりCも合成しよう」となった時などを想定しています。
AとBの合成音を再生するために、合成音を出力するバッファを用意しますよね。
その後Cを合成するのが決定した時、
・再度A、Bのデータもひっぱってきて、3音合成する
というよりは
・A+Bの合成音にCを合成する
ほうがメモリー効率や処理速度などで有利そうです。
ですがそれだと丸めこみ問題がでてしまいます。

317 :
普通は64bitとか128bitで計算して最後に戻すのよ。

318 :
>>普通は64bit
一体16bit音源を何万個合成するつもりだよw

319 :
>>316
> その後Cを合成するのが決定した時、
そんだけ仕様が未確定だと汎用的にプログラム書くしかないから効率もクソもない。
数百万サンプル程度の加算が問題になるような環境ならできることの自由度を下げる以外ない。
あと「〜そう」で目についたところを最適化するのはほぼ最悪の戦略。
かなりの確率で最適化ポイントを間違う

320 :
ごめんねぼくはdouble厨なので

321 :
コンプレッサ実装すれば?
r = 初期値1.0
出力サンプル = 合成サンプル * r
出力サンプルが16bit幅超えたら、r = abs(合成サンプル) / 32768.0 で更新
r < 1.0 なら時間経過と共に少しずつ1.0へ戻してやる
実用レベルで実装するなら細かいノウハウとかあるからDSP関係の文献自分で調べて

322 :
>>314は「丸め」とか用語が適切じゃないからちょっと知識が不足してる感じがするね。
俺もコンプレッサ/リミッタ関連について調べてみることをお勧めする。

323 :
コンプレッサーはデータを改変してしまうからよくないだろ。
ノーマライズすればいい。

324 :
いまどき整数とか面倒
不動明王を使うだろ普通

325 :
恐れ入谷の鬼子母神

326 :
>>314
分解能32ビットとかで作業用データ配列を作成すると良い。すべて加算した後16ビットレンジに収まるよう最適化する。
一旦WAVファイルをセーブした後、さらに別のWAVファイル加算したいときは、16ビットでは精度が不足するので、
以下の方法を取る。
WAVファイルの分解能をfloatか24ビットとする。フォーマットの設定が16ビットと異なるがちゃんと再生されるWAVファイル
を作成することができる。
参考:
WAVEFORMATEX構造体
WAVE_FORMAT_IEEE_FLOAT

327 :
float
-> WAVEFORMATEX
24ビット
-> WAVEFORMATEXTENSIBLE

328 :
midiデータから波形を作成するにはどうすればいいですか?

329 :
ソフトウェア音源でファイルに出力する

330 :
waveout

331 :
中古楽器屋でMT-32というのを探して買ってくるんだ

332 :
ソフトウェア音源を作りたいって話だろ!

333 :
MT-32まだ持ってるなーw

334 :
それGM非対応や!

335 :
ソフトウェア音源を作るにはどうすればいいですか?

336 :
どんなのが作りたいんだ?

337 :
MIDIデータには、どの楽器でどの高さの音をどのくらいの強さで出すか
とかそんなデータが入ってる。
この楽器の音は演奏する側が用意しなきゃならない。
実際の楽器の音などをサンプリングして内蔵しておいて要求に合わせて
編集して出すことになると思うよ。

338 :
今で言うところのマルウェア認定のwingrooveまだ使ってるわ

339 :
波形データの作成はできても、OSのサウンドAPIに鳴らさせるのがやっかい。

340 :
そこは定型処理だからほぼ悩む所じゃないけどな

341 :
>>338
破壊型のウィルスだろう

342 :
ワレザー乙

343 :
波形データをサンプリングせずにプログラムのみで作成したいのです

344 :
そんな当たり前のことを質問するような椰子に何を言っても無駄だYO

345 :
>>343
そしたら普通に式書いてそれでウェーブ作ればいいじゃない。
まずはサイン波でやってみそ

346 :
ウイルス 寄生 自己増殖
ワーム 非寄生 自己増殖もしくは移動
トロイ 寄生 非自己増殖
マルウェア 上記を含む迷惑ソフト全般

347 :
ウィルス対策ソフト 寄生 定義ファイルのダウンロードによる自己増殖 有料

348 :
メガデモ的なサウンド演奏プログラムを作りたいな。
できる限り少ない容量で、いい音を出すって言う。

349 :
メガデモはやり始めたらキリがない。

350 :
>>343
シンセ作りたいってことでしょ?
ニコニコ動画にJavaでソフトシンセ作ってる人がいるよ。
ところでこのスレの住人でJava使ってる人いる?
Javaにサウンドプログラミングは耐えられるかな。

351 :
イコライザーってどうやるのでしょうか?
キーワードだけでもいいので教えていただけると幸いです

352 :
>>350
Java自体は問題ない。Javaで書かれた音楽ソフトもある。
>>351
http://www.musicdsp.org/files/Audio-EQ-Cookbook.txt

353 :
>>352
ありがとうございます!読ませていただきます。

354 :
>>335
つ ttp://msdn.microsoft.com/en-us/library/ff537519(VS.85).aspx
カーネルモードで動くドライバーを書く必要がある
素人では無理

355 :
ソフトウェアMIDI音源だったらそうだろうけどさ

356 :
ここの人たちは仕事をなにを?

357 :
仕事がない鬱だ死のう

358 :
DFTで周波数分解能をあげるためにゼロ詰めしたりしますが、なぜこれが許されるのですか?
元の波形のスペクトルを変えてしまっていることになりませんか?

359 :
それで増えるのは元々のナイキスト周波数を超える部分だから削れば問題なし

360 :
ということは、結局周波数分解能はあがらないということですか?
1


361 :
>>350
おお、ありがとう。
これをC++に移植してみるよ。

362 :
ナイキスト周波数のサイン波ってパルス波になってるから
元の周波数は保存できても音質みたいなのは絶対違うと思うけど
なんで誰も突っ込まないのか不思議。

363 :
厳密な矩形波なら帯域が無限大まで伸びてる。
それをナイキスト周波数でばっさり切る理想的なローパスフィルタを通せば、
元の通りのサイン波が出てくる。

364 :
0埋めの理由が、本当に周波数分解能を上げるためなのかどうか、って話?

365 :
>>363
それよりも位相がずれてたら、波形がなくなるよな
そっちが問題

366 :
単に2倍を越える周波数でサンプリング云々ではなく、実際にはもっと難しい計算があるらしく、それを行うと位相のタイミングのずれは無問題らしい。

367 :
あ、サンプリング定理の話じゃないのか。まあいいか。

368 :
>>366
どういうこと??詳しく
サンプリングポイントを最高周波数の位相に合わせてシフトするの?

369 :
http://embedded.com/design/207400936?pgno=3
こゆ話?

370 :
>>360
0埋めしてDFTサイズ増やしたって本当の意味での分解能が上がるわけないでしょ。
ただsinc補完される(丸くのっぺりした波形になる)だけだよ。

371 :
つまりアップサンプリングでサンプリングレートを上げている=周波数分解能があがっている
ということですよね?ただアップサンプル時に差し込んだ0に意味がないと

372 :
パルス波はサイン波と違って倍音を含むだろ?
サンプリングレートの半分のサイン波はパルス波になってるだろ?
でもサンプリングレートの半分以上の周波数は出ないはずだろ?
ではパルス波の倍音はどこにいったの?

373 :
周波数帯域無限大のマイクとかスピーカーとかケーブルを持っている人はうらやましいですね(棒)

374 :
鼓膜もね

375 :
きっと頭にデジタル入力端子が付いてるんだよ

376 :
>>372
ナイキストレートで折り返す

377 :
折り返しが自分と重なって、表現できないんじゃないかな

378 :
>>372
>サンプリングレートの半分のサイン波はパルス波になってるだろ?
意味不明

379 :
1サンプルで半周期ってことだろ

380 :
0.5fsの純粋なサイン波なら普通に0.5fsのサイン波としてデータ化されるでしょ。
どこから「パルス波」が出てくるのかわけわからん。
0.5fsを超える周波数成分がある信号なら超えてる部分は折り返すし、倍音(1.0fs)
成分があるならそれは折り返してDC成分になる。

381 :
「普通に」というのは訂正。
初期位相によっては振幅がどっかいっちゃう(最悪0になる)。

382 :
プログラム上はDCオフセット許容していいもの?
カップリングコンデンサが大抵入るから16〜20Hzぐらいの余裕が必要?

383 :
ASIOプログラミングに初挑戦してるんですが、
ASIO SDK 2.2 についてきた hostsample をビルドすると
(hostsample.vcproj を VC++2008 でオープン)
Debugビルド → 正常に動く
Releaseビルド → 動かない
となってしまいます><
たどってみると、ASIOGetChannels()がReleaseビルドの時は
おかしな値を返してる(outputチャンネル数が2なのに8と)ようです・・・
何がだめなのでしょうか?

384 :
だめな点がだめなのだと思いますよ

385 :
ASIOは音源チップやドライバに影響されまくった経験あるので
とりあえずばっさり違うPCでデバッグするのが吉

386 :
自己解決しました

387 :
>>385
ありがとうございます
見た感じシンプルで間違えようが無さそうなんですけどねー>hostsample
ライブラリとかプロジェクトの設定まわりでもう少しもがいてみます
一応ASIO対応のプレーヤーからは音が出るので正しいやり方はあるんでしょうね・・・

388 :
いえいえ

389 :
おまえアク禁な

390 :
漏れもASIOで音を出したいな。

391 :
他スレから誘導されてきました
質問させてください
サーバでwavファイルをいろいろ操作しながらストリーミング配信のようなことをしたいので、
その方法を模索中です
具体的には、ドップラー効果を付加したwavファイルをクライアントに聞かせたいのですが、
ストリームで流すためにはどのようにwavファイルを生成すればよいでしょうか?

392 :
波形作り終わってる前提ならタダのRIFF-WAVEフォーマットでおくりゃーいーじゃんか

393 :
waveのファイル読み書きするプログラムを組んでます。
波形のデータはすぐに読み込むことが出来たのですが、
ここから時間ごとの音量のグラフを作るにはどうすればいいですか?

394 :
波形は取れたんだろ? なら後は好きなようにプロットしろ。このスレの領分じゃねぇ

395 :
音量を得る方法はこのスレの範疇だろがよ
二乗平均平方根でググれ

396 :

>>393
音量とは何かって事とWavファイルの情報は何を意味するのかを考えてごらん

397 :
無事、望んでいた結果が出ました。
ありがとうございます。

398 :
時間毎に最大値を表示したらいけないの?
二乗平均平方根とか大学行くと勉強するのでしょうか。

399 :
おまえには関係ねえよ

400 :
そっちはPEAKだな
波形のクリッピングを検知するのに使われる
聴覚上の音量とはほど遠いぞ

401 :
耳へのダメージを測るためにエネルギー計算をします

402 :
1/3octで帯域分割してラウドネス求めろ
もしくは聴覚フィルタシミュレーションしろ
パターソンの論文でも嫁

403 :
>>400
アナログなメーターの動作か?
あれはピークじゃないんだ。

404 :
聴感上の音量とかピークとかと耳へのダメージもほど遠いと思うんだ

405 :
>>393
遅レスですまんが、ラウドネス計算をするプログラム見つけたので貼っとく。
http://d.hatena.ne.jp/amarui/20100223/1266893744

406 :

ピッチシフトですごく遅いピッチのときに
ノイズを軽減する良い方法ってありますか?
なるべく処理が重くない実装を探しています。

407 :
面倒なんでボリュームを落としてる

408 :
FFTの勉強してるんですが
FFTで求まったフーリエ級数にどんな処理をして逆FFTすれば
ピッチの変更が出来ますか?

409 :
簡単なMML音源のようなもの作ってみたんですが、音量上げるとすぐクリッピングするし
音量下げると個々の音が小さくて困ってます。
皆様どう対処されてるんでしょう

410 :
>>408
ピッチの変更を、音色とテンポを変えずにピッチだけ変更とエスパーしてみる
FFTを勉強し始めたレベルでは、この課題は難しすぐる
マジで答えると本が書ける
ローパス・ハイパスなんかのフィルターや
ハムキャンセラーやイコライザーから始めては
>>409
どんな音源波形か知らんが、サイン波にエンベロープをかけた程度なら
その現象がおこる
音の強さは音量によるのではなく、アタック部分の音質による
ノイズやインパルス成分
サンプリング音を使うのも手だが、ちゃんとした音源作りは難しいよ

411 :
リミッターの話じゃないのかな。俺の知る限り銀の弾丸はない。

412 :
NintendoDSiに入ってる録音した音をトランペット風に変化させるってどんなアルゴリズムなのかな?

413 :
サンプルを

414 :
周波数を変えずに波形だけ変えるんじゃまいか

415 :
ピッチとレベルを抽出して、サンプラーを叩く
かな?

416 :
PCMはならしてないとおもうなー

417 :
だったら、元音から一波切り出してループ再生
エンベロープをトランペット風にアレンジ

418 :
BLITってのの原理がいまいちよくわからないんだけど、
日本語で解説してあるページってありませんか?
musicdspとかに英語で解説してあるテキストはあるんですが、わかんない……

419 :
瞬時周波数ってどういうもの?
何に役立つのかがわからん

420 :
自動車の速度メーターと同じ

421 :
保守

422 :
点検

423 :
これ良いね
早く普及して欲しいわあ
http://chromium.googlecode.com/svn/trunk/samples/audio/specification/specification.html

424 :
結構本格的に実装されてるのはいいが
リアルタイムだとCPUパワー余っててもブツ切れだな
>>418
今更かもしれないけど、要は矩形波や鋸波の倍音構成を
正弦波の合成で再現してやれば絶対に折り返しノイズが発生しないって理屈

425 :
>>424
その理屈自体はわかりますが、実際にリアルタイムに正弦波で矩形波とかを合成すると
どう足掻いても音が飛んでしまいプチノイズの嵐になるわけで。
それを避ける為の合理的な計算なんかも恐らくBLITってのには含まれてると思うんですが。
どっちかってーとそっちを知りたい。

426 :
単純計算で、200Hzを合成すると20kHzまでとして100個か

427 :
FFTするサンプル数増やすと、パワーの最大値が増えるのはなぜですか?
10000Hzの正弦波waveファイル(16bit)を窓関数なしでFFTしたとき
サンプル数が以下のときの最大のパワーは
1024 は 15701165
2048 は 25431718
4096 は 62699682
8192 は 101021697
でした
同じ正弦波なのに最大値が違うのが
なんか納得行かないんです

428 :
>>425
BLITは>>424で解説した理屈以上のものじゃないぞ
実装時は基音を元にした各倍音の位相テーブルを作っておいて
合成するのが一般的・・・なハズだ。俺もそんなに多くの実装を目にしたわけじゃないが

429 :
>>427
1024サンプルで正弦波が途切れるwaveファイルに
各サンプル数でFFTをかけてみたらどうなるかな?

430 :
1Hzの正弦波のテーブル作っといて、希望の周波数をインターバルにテーブルを
読んでく、っていう手法の解説を(それとは関係ないけど)昔読んだことがある。
440個ごとに読み出せば440Hzの波形が出てくる、ってことね。

431 :
DDSのハードウェア実装はそんなんだったかな。

432 :
>>429
回答ありがとうございます
ご指示の通りサンプル数453のwaveファイルで試したところ
以下のような結果になりました(FFT時に、波形の無い部分は0埋め)
1024 … 7200310
2048 … 7200310
4096 … 7284914
8192 … 7284914
4096と8192が微妙に違いますが、ほぼ同一の値が得られました
この結果はつまり、>>427で値が違ったのは
切り出した波形の総エネルギーが違うから
という理解でいいんでしょうか?
最大パワーは2048なら1024の2倍、4096なら4倍になるというような感じで

433 :
>>432
その解釈でいいと思う.
DFTの定義によるけど,サンプルを総和することになるからFFTポイント増やすと値は増えるはず.
そのFFTの値をそのまま逆変換する場合,サンプル数で割るから値は増えずに元に戻るよ.
http://ja.wikipedia.org/wiki/離散フーリエ変換

434 :
>>433
ありがとうございました
独学でやってるんで
ふとした疑問を聞ける人がいなくて困ってたんです
助かりました

435 :
OpenALにはハード毎の同時発音数制限が無いのでしょうか?
手持ちの2つのデバイスで再生させると、両方とも一応256ソースまではAL_NO_ERRORで同時再生できてしまいました。音は潰れますが。
ソフトウェア処理だからだとしたら、逆にハードウェアでOpenALに対応していたら発音数が256以下だったりするのでしょうか?

436 :
あった気がする
もうあんまり覚えてないけれど、十何個かそこらしか生成できなかった記憶が

437 :
取り敢えず仕様としては決まってないよな
実装依存だと思う

438 :
44100のWAVE波形を半音上げ下げするにはレートをいくつにすればいいんですか

439 :
1オクターブ上が2倍
1オクターブは12半音
なので半音上は2^(1/12)倍
あとは計算して

440 :
thx
あと、音ってなんで足して2で割ると混ざるの?
すごい不思議なんだけど

441 :
足す操作そのものが混ぜることだから。
水面の波紋も同じ。

442 :
VSTで簡単なVUメーターを作ってるんだけど、
VSTGUIを使って、Idle()のなかで描画するようにしたら、なんだか動きが遅くて・・
VUメータのようなものを描画するときは、
「GDI+」とか、「directX」で描画したほうがいいのかな・・?
誰か、詳しい人おしえてくらはい

443 :
リアルタイムな描画をもとめないならGDIで描画したほうが楽だよ。

444 :
ありがとう!
ひとまず、GDIでやってみます。

445 :
VSTはDTM板にもスレがあるので参考に

446 :
1bitのデータをマルチビットのPCMに変換したいのですが,
全くイメージできずに行き詰っています。
PCMであれば間に0を挟んでアップサンプリング,FFT,
LPFといった処理をしたことはあるのですが,1ビットは
ちんぷんかんぷんで・・・
どなたか,勉強のしかたをアドバイスいただけないでしょうか?
PS3でのDSD→PCM変換は教科書どおりにやっているから音
質がよいといった表現を見かけますが,その教科書に相
当する考え方をまずは知りたいと思っています。

447 :
本物のDACもLPF通すだけみたいな状態だし
単純にLPFのあと間引きすればいいんじゃないの?

448 :
1ビットのデータにどうやってLPFをかければいいかわかりません。
PCMであれば,
倍精度浮動小数点の配列→FFT→LPF→逆FFT→倍精度浮動小数点の配列
という手法ならわかるのですが,1ビットのときは???

449 :
>>446
+1と-1の集合だから
落とし込みたいサンプリング周波数の範囲で足し算して割るだけ

450 :
>>449
ごめんなさい。よくわかりません。
>+1と-1の集合だから
これはわかりました。1と0ではないのすね。
>落とし込みたいサンプリング周波数の範囲で足し算して割るだけ
ここがわかりません。
もしよろしければ,もう少し具体的にお教えいただけるとありがたいのですが。
1bit 2822400Hz→16bit 44100Hzだとどのような計算になるでしょうか?
2822400個の配列があるとして,
0〜44099の1or-1を合計して,その値を44100で割るという事になるのでしょうか?
あれ,でもこれだと1秒間に64サンプリングしかできない・・・



451 :
単純なFIRフィルタも理解できないのか?
とりあえず答えの一つみたいの見つけた
ttp://www.hydrogenaudio.org/forums/index.php?showtopic=37717&start=0&p=670042&#entry670042
ttp://www.hydrogenaudio.org/forums/index.php?act=attach&type=post&id=5524

452 :
>>451
コメントありがとうございます。
>単純なFIRフィルタも理解できないのか?
はい。全くわかりません。
今回の処理に必要という事でしょうか?そのキーワードもあたってみます。
>とりあえず答えの一つみたいの見つけた
ありがとうございます。VB開発者なものでソースコードの解読に苦労しそう
ですが,こちらも勉強してみます。
少し道がひらけた気がします。ありがとうございます。

453 :
FFTした後にどんなLPFフィルタ使ってたんだろ・・・

454 :
>>453
LPFに「どんな」ってどういう事でしょうか?
単純に一定周波数以上の値を「0」にしてから逆FFTしてるだけなのですが・・・

455 :
>>449
1ビット 2822400Hz→マルチビット 44100Hzの場合
仮に32768サンプルの1bitデータがるとして,
2822400÷44100=64なので
64個毎に合計して,その値を64で割ることを512回繰り返せば,
512サンプルのPCMなったりするかなぁ思うのですが,どうでしょうか?

456 :
これ普及して欲しいなあ
https://wiki.mozilla.org/Audio_Data_API

457 :
NaClでも出来そうだ

458 :
HTML5のAudio Data APIでWAVファイルの音階を変えて
再生するのって出来ないんでしょうか
mozSetupやmozSampleRateで周波数を変えてもうまくいかず
WAVファイルの音階を変えて再生する作曲ソフトを作りたいんだけど
JavaScriptが駄目ならC言語とかでもいいんだけど
そもそも音階というのは単に周波数の値を変更するだけで変えられるもんなんでしょうか
それともデータをちゃんといじってあげないといけないのか

459 :
>>456
これはすごいな、普通にFireFox上で動作するソフトシンセとか見つかってびっくりした。
時代を感じる。

460 :
やはり,1bit→PCMがわかりません。
1,1,1,0,1,1,1,1
という1bitの連続したデータを
同じサンプリング周波数のマルチビット整数にすると
1,2,3,2,3,4,5,6
となる。
という考え方は誤っているでしょうか?
上記の方法で作成したPCMデータは音としては聞き取れますが,
音質としてはひどいものでした。
低域がかろうじて鳴っているだけで,中域,高域はまったく感じられませんでした。
どなたかアドバイスをいただけないでしょうか?

461 :
ちょっとぐぐればいくらでも出てくるのに自分で調べる気ねぇの?
ttp://oshiete.goo.ne.jp/qa/1816052.html
ttp://patent.astamuse.com/ja/published/JP/No/2008141470/
ttp://blog.goo.ne.jp/commux/e/e08c353a7d0d5be49a00c3c61e7b8372
まぁ既に読んでてそれでも解らないってんならお前には無理だから諦めろ

462 :
>>461
ありがとうございます。
この2週間ほどグーグルに聞いてはいたものの,理解できるような
文献が見つからなかったので,こちらを頼った次第です。
2つ目は見つけましたが,理解不能でした。
1つ目と3つ目はまだ見たことがなかったので,これから読んでみよ
うと思います。
この度は誠にありがとうございました。
重ねてお礼申し上げます。

463 :
>>461は意外といいやつだと思う

464 :
サイン波を入力するときって
サイン関数の値を書き込む方法みたいなダサい方法は普通使いませんよね。
ということでみんなやってるやり方とかはどの本に乗ってますか?

465 :
日本語でOK。

466 :
OK?おkじゃなくて?
恥を晒したな・・・
というわけでレスポンスよろwww

467 :
> サイン関数の値を書き込む方法みたいなダサい方法は普通使いませんよね。
そうなの?

468 :
>>464
お前の考えるスマートな方法を先に言えよw

469 :
IIRでぶんまわすだけじゃ駄目なの?

470 :
コサイン関数の値を書き込む

471 :
方形波にLPFをかける

472 :
1本だけ立てて逆FFTする

473 :
サンプリング周波数変換の方法をどなたかお教えいただけないでしょうか?
自分で調べてやってみた方法は,
1. 44.1kHzに0を挿入して8倍(352.8kHz)にアップサンプリング
2. FFT→LPF(音の周波数22.05kHz)→逆FFT
3. 352.8kHzを間引いて48kHzにする
上記の方法では,処理も遅く高域にノイズが発生しているように聞こえます。
どなたかテクニックを伝授していただけないでしょうか?

474 :
>>473
ttp://www.madlabo.com/mad/book/
ここの「任意レート変換 サンプリングレートコンバータ.pdf」がわかりやすい

475 :
>>473
高域にノイズ発生の問題はLPFの効きが弱く、折り返し歪が発生しているのでは?
極端に遅いなら2のやり方がおかしい気がする。

476 :
>>474
ありがとうございます。
私には難解な内容ですが,一読してみようと思います。
>>475
>高域にノイズ発生の問題はLPFの効きが弱く、折り返し歪が発生しているのでは?
コメントありがとうございます。
整数倍の場合は品質的に問題ないように思います。
恐らく非整数倍のときの「3」の間引き方の方法を工夫しなくては
いけないのかと思って入るのですが・・・

477 :
>>473
きれいにやるには >>474 のような方法が現実的だし、実際よく行われてます
44.1kHz:48kHz=147:160なので、
タップ長(たとえば101)×(出力パターン数)160の
係数テーブルを作って計算します
(係数を削減する方法もある)
>>473 のようにFFTを使いたいなら、
窓がけ、オーバーラップ、などをしないと不連続ノイズが出ると思います
FFTするし、それなりに重いのは仕方ないでしょう
適当にやるには、(0挿入ではなく)前の値を保持(0次ホールド)するか
直線補完(1次ホールド的な?)でもしながら48kHz信号を無理やり作り、
20kHzくらいのカットオフの高めの次数のLPF(IIRなら8次以上とか)をかければ、
まあきれいではないけど、軽くできるできるんじゃないかな
波形の見た目のきれいさを求めて、あんまり音的には意味の無い
近時曲線でサンプルを補完しちゃう人もいますけどね
それが割といい音がすることもw

478 :
アップサンプリングなら元データのほうが周波数低いんだから
画像みたいに数タップのLanczosで補完しちゃだめなの?
Bスプラインを使ってたハイエンドメーカーもあったようだけどそっちは高域が落ち込むだろうし

479 :
というか、ハードディスクの容量とか制限ほとんどないんだし
する意味無いだろ。

480 :
>>478
> アップサンプリングなら元データのほうが周波数低いんだから
というよりサンプリング周波数比が単純じゃないのが面倒なのでしょう
> 画像みたいに数タップのLanczosで補完しちゃだめなの?
それは >>474 を数タップでやるのと同じことなのでOKだと思います
ただ、(これを言うと画像屋さんには怒られるけど)
画像と比べて音は求められるSNが非常に高いので
数タップで、また、固定の係数なんかではあまり良いスペックは出ません

481 :
>>478
44.1kHzから48kHzへ変換する場合、160倍の0補完アップサンプリングと
147倍の間引きダウンサンプリングをするなら、タップ数が1000〜とかでも
演算結果が0になることがわかっている分は除けるから
畳み込みの回数は1サンプルに対して〜10程度になるよ

482 :
http://www.dtmstation.com/archives/51741938.html
これって、どんなアルゴリズムで動いているのでしょうか?

483 :
FFT

484 :
フリーのソフトでも転がってたやつを、UIを綺麗にして売り物にしたって感じだね
触ってないけど、それほど目新しいものでもなさそう

485 :
左右のパワースペクトルを差分取って定位割り出しって感じかな
可視化するのは個人的に目から鱗

486 :
これだいぶ前に他の会社が同じもん出してたぞ
売れてんのかは知らんが

487 :
切り出すU/Iのでき次第だから、ぶっちゃけアルファテストを積み上げた分だけ使い勝手がよくなるかと。

488 :
>>485
>左右のパワースペクトルを差分取って定位割り出しって感じかな
左右の定位置を求める方法、もっと詳しくしりたいのですが、
なにか資料とかキーワードとかあります?

489 :
>>488
超アカデミックな基礎としては、ブラウエルトの音像定位の本(日本語は絶版してると思う)
だけどそこまでのことはやってないでしょうw
せいぜい各周波数エレメントごとのLRの振幅比からパンを割り出してるくらいじゃないのかな?
位相差も見てたらすばらしいと思うけど

490 :
>>489
http://www.amazon.co.jp/dp/4306041972
これでしょうか?情報ありがとうございます。

491 :
ボーカルを処理例に出されてもな……って思った。
センターに定位してるのが普通だし、周波数帯域も限定されてて
比較的簡単な部類なんだから、他のパートでやってくれないと。

492 :
コロナ社の「空間音響学」は事例も新しいし内容もコンパクトにまとまってて良い感じ。

493 :
フィルタ自体のプログラミングは、いったいどうしているのですか?

494 :
>>493
漠然としすぎてて難しい質問だな
係数をかけたりzバッファにためたりするプログラムをしているよ

495 :
>>494
フィルタをどうすると言う書き込みは多いけど、フィルタ自体はどうしているのかなと思って。
みな自作しているけど、疑問なく作れるってことですか?

496 :
>>495
デジタル信号処理の知識があればできるよ

497 :
アナログのフィルタ回路をデジタルに変換できるので、
アナログのフィルタ回路の作り方を探る手もあると思うよ。

498 :
アナログ世代乙

499 :
>>498
ゆとり世代の耳にはデジタル入力がついてるのか
アナログというよりs領域で設計してs-z変換ということでしょ
特にIIRフィルタはs領域での設計は楽だから
z領域で設計するのは至難の業だ
アナログ回路の伝達関数をs関数にすることも楽だ

500 :
>>486
掴んだのを移動できるのは見たことないぞ

501 :
>>500
遅せぇよ、ただしこれはマスキングなピッチ・タイムストレッチは別機能
ttp://www.psoft.co.jp/jp/product/chronoplayer/index.html

502 :
だから定位は変えられんでしょ?

503 :
すいません、スレ違いかもしれませんが相談に乗ってください。
あるMIDI機器を操作した際に出るSystem Exclusiveをプログラム・チェンジに変換して、
演奏情報も一緒に別の機器に送りたいんですが、何を勉強すればいいでしょうか?
当方プログラミングの経験なしです・・・(無理っすか?

504 :
Windowsサウンドプログラミング―音の知識×プログラミングの知識
って本がMIDIについて結構詳しく書いてあったような気がするので
立ち読みして良さそうなら買ってみたらどうだろう

505 :
>>504
ありがとうございました! 立ち読みしてみます。
でも、友人に「無謀だ」と言われ、くじけそうな心・・・

506 :
>>503
簡単に実現したいのだったらMaxとかPureDataという手もあるかもしれない。

507 :
音声データを加工したくて勉強しています。とりあえず「C言語ではじめる音のプログラミング」
という本を買って読んでいるんですけど、何をしているのかわからない箇所があるので教えてください。
音声ファイルのオープン時にWAVEファイルのPCMデータ(1サンプル16bit)を読み込んでいるのですが、その際に
  short data;
  double *pcm = calloc( length, sizeof(double) );
  for( n=0 ; n<length ; n++ )
  {
   fread( &data, 2, 1, fp );
   pcm[n] = (double)data/32768.0; /* 音データを-1以上1未満の範囲に正規化する */
  }
と、省略して抜き出しましたが、コメントはそのままです。
そして、ファイルへの出力時に
  double s;
  for( n=0 ; n<length ; n++ )
  {
   s = ( pcm[n]+1 )/2.0*65536.0;  
   if( s > 65535.0 )
  data = (short)(pcm

508 :
16ビットの値 (-32768 〜 +32767) を浮動小数点の値 (-1.0 〜 +1.0) に変換してるだけじゃね
-32768 〜 +32767 より -1.0 〜 +1.0 の方が加工とか処理するのにわかりやすくて扱いやすい、と本の中の人は思ったんだろう
ファイルに書くときは当然また16ビットに戻す必要がある

509 :
途中で書き込んでしまいました!!! 出力時のforの中はこうです。
for( n=0 ; n<length ; n++ )
  {
   s = ( pcm[n]+1 )/2.0*65536.0;  @
   if( s > 65535.0 ) s=65535.0;
   if( s < 0.0 ) s=0.0;
   data = (short)(s+0.5)-32768; /* 四捨五入とオフセットの調節 */
   fwrite( &data, 2, 1, fp );
  }
そこで、わからないのは何故double型にして-1〜1の範囲に変換(正規化?)しているのかです。
本文には「精度を考慮して正規化する」とあるだけで、こうすることによってどうして精度が良くなるのかがわかりません…。
正規化でググっても違う意味のものが検索されてしまいます。
それから元に戻すときはどうしてわざわざ @ のように(これだと0〜65535の範囲になる)してから、-32768〜32767に
戻しているのかとか…。必要なんでしょうけどどういう効果があるのか具体的にわからなくてもやもやしていて先に進めません。
ググって調べられるワードなどでも何でも良いので教えてもらえるとありがたいです。よろしくお願いします。

510 :
ああ、すでにレスしてくれてる方が!!ありがとうございます。
>>508
なるほど、扱いやすいプログラミングの好みみたいなものなんでしょうかね。
あまり深く考えないほうがいいのかな。

511 :
処理内容にもよるけど、そのまま16bitの範囲で処理するとオーバーフローなども気にしないといけないし
複数のフィルタかけたりすると累積の計算誤差も減るし
まあ耳でわかるようなもんじゃないかもしれないけど、わざわざ誤差作るほどじゃないという感じでもある

512 :
0〜65535 にしてから -32768〜32767 にするのは、負の値の切り捨てを嫌ったんじゃないかと
単純に整数化すると -0.999...〜+0.999... の範囲が 0 になるんじゃないかな

513 :
>>511 >>512
加工する過程での細かな誤差を嫌ったという感じなんでしょうかね。
正規化(?)をするのとしないのとでは実際どの程度違う結果になるのかわかりませんけど、
いまはあまり気にしなくてもいいのかな。
実際は読者からの細かい突っ込みを嫌ったためのような気も(笑)
少なくとも音声データの加工そのものとは直接関係ないようなので先に進んでみます。
ありがとうございました!

514 :
C++って難しいんでしょうか・・・
(こんな事をきいてるようじゃ無謀と言われてもしょうがないですねw)

515 :
そうですね

516 :
っていうかそこは序盤だから理由が判らないだけで
後半でデータ加工するのに都合良いようにしてんだろ

517 :
整数レジスタ使って固定小数点演算でがんばる時代は終わったか

518 :
ていうかひたすら物量つぎこんで速くしたFPUが、大量生産で安く手に入るから、
それ使っちゃえば安くて速い、という。

519 :
>>517
20年くらい前に終わってる

520 :
20年前は嘘だな。
10年くらい前でも整数演算でやる方がずっと速かった。
SSEとか出だしてからじゃないか?

521 :
整数演算てどういうものをいうのかわかってない自分
加工前に1000倍して加工後に1/1000にするとかでしょうか?

522 :
PentiumのUVパイプラインあたりからかな。
あるいはAlphaあたり。

523 :
最近だとDSがまだ固定小数点をつかってますね

524 :
固定小数ならではの便利な事もあるんだよね

525 :
精度を固定とか荒くてもいいならデータをコンパクトにまとめられるとかかな?
MIDI命令みたいに可変長byteの整数つかってもおもろいかも。

526 :
まさに小数点位置が固定されていることでしょ

527 :
まだ固定小数点DSPの方が安いしクロックも速いのがあるからね
サンプリングレートが異常に高い分野ではまだまだ現役
最近は浮動小数点DSPも安くなったし、オーディオなら、オーバーフローとか
ヘッドルームとかほぼ考えなくて済むメリットの方がかなり大きい
が、まだ32bit floatが主流で、24bit精度が精一杯
フィルターかけまくり、ミキシングしまくりだと、そろそろ精度的に限界かな
PCのアプリなんかは64bit doubleが使われるようになってきたし
(PCのCPU(FPU)はもともとdoubleの方が計算速度速いっていうのもあるけど)
(メモリもたくさん使えるしね、DSPに比べたら無限にあるみたいなもの)
(ただし同じパフォーマンス出すのにCPUのコストは10倍以上、下手したら100倍かかるけど)
DSPも倍精度浮動小数点になっていくのかなぁ

528 :
FPU付きのDSPってみたことないや。いつも固定小数点でやってます。
DSPの定義の問題なのかな?

529 :
iOSやAndroidなんかだと、ハードによってはFPUしょぼいんで
固定小数じゃないとリアルタイム処理はきついね

530 :
最近のオーディオプレイヤーにある,高域の周波数成分を補間する
機能を実装すると考えた場合,FFT意外に何か考えられる手段はあ
るのでしょうか?
もしくは,完全フリーで高速なFFTライブラリがあれば教えていた
だけるとありがたいです。
ソースコードの開示が必要ないものがよいのですが・・・
今は大浦さんのFFTを使わせてもらっていますが,もっと速いもの
はないかなぁと思いまして。

531 :
むしろ完全フリーで高速なFFTライブラリを作ってくれるとうれしい。

532 :
残念ながら,数学が大嫌いなプログラマーなのです。

533 :
>>530
FFTの手段っていうのは漠然過ぎない?
フリーだとFFTWが有名だけどコードの開示は知らないです。

534 :
>>528
今は主要各社ラインナップありますよ
まあ確かにDSPとしてはハイエンド系かな
もちろんアーキテクチャは積和命のDSP
>>530
よくあるタイプは、高域に非線形ひずみかけて倍音を発生させて、
さらに高い超高域を作り出している
例えば、HPFで高域取り出す→クリップさせる→奇数次倍音発生
→超高域HPFかけて取り出す→原音に足しこむ
みたいな感じ(偶数次倍音の発生とか、足しこみ方とかいろいろあるけど)
こうして作られた超高域は、一応倍音だから、元は有ったかもしれないんですw

535 :
>>533
FFTした場合は周波数成分へのアクセスは簡単なので,
そこは工夫次第でどうにでもなりそうですよね?
ただ,FFTそのものの処理時間がネックに感じています。
>>534
むむむ,難しい・・・すいません。頭の悪い私には理解
不能でした。
FIRとかIIRとかそっち系でしょうか?実はFIRを理解して
おらんのです。

536 :
>>535
そっち系ですw
でも分かれば非常に軽く実装できますよ
FFTは万能なようで色々面倒なこともあります、まず重いし
連続処理じゃなくてブロック処理になるんで、
連続信号の音を綺麗に処理するのは結構苦労します
分析には向いてますけどね
とりあえず時間分解能と周波数分解能で悩むでしょうw

537 :
>>536
やはりそっち系でしたか!
まずはFIRの勉強しないといけませんね。
FFTはどうしても矩形窓を使いたかったので,オーバーラップの
実装に苦労しました。
ありがとうございます。

538 :
初歩的な質問かもしれませんが,16bitPCMデータの場合
・1〜32767
・0
・-1〜32768
でデータを表現する事ができますよね。
しかし,+と−で解像度が1つ異なるのですが,
浮動小数点数との相互変換のとき,この1つの違
いをどう考えればよいのでしょうか?

539 :
>>538
問題ないのでは?
x∈R
-32768.0 <= x < 32768.0 と考え
デジタルデータ d は x の小数点以下を切り捨て、それより小さい最初の整数に変換されると考えると、「解像度」に違いはないと思います。

540 :
浮動小数点というのは,-1〜1の範囲のことです。
ですから,+の場合に整数→浮動小数点変換する場合は
32767÷32768なのか
32767÷32767なのかという事です。

541 :
>>540
変換前の PCM データを x,
変換後の浮動小数点データを y としたとき、
y = x * 32768
とすれば問題ないと思いますが‥‥‥。
別の例で考えてみます。
*----*----*----*----*----
0 1 2 3 4
0 <= x < 5 の連続値をとるアナログデータをデジタルデータ化する方法として、x の小数部分を切り捨てた値に代表させるとします。
このとき 0 に代表させられるアナログデータ、1 に代表させられるアナログデータ、‥‥‥ 4 に代表させられるアナログデータ
とグループ化した場合、どのグループも「属するアナログデータの数は同じ」と考えられないでしょうか。
ここでは、アナログデータ x ≠ 5.0 としていますが、仮にアナログデータ x = 5.0 の場合もデジタルデータは 4 とする、としてもほとんど問題ないと思います。
しかし正確な説明は難しい。数学の言葉としては何が該当するでしょうかね。1 対 1 対応ではないからカントールの濃度ではないでしょうし。


542 :
>>540
失礼
y = x / 32768.0
ですね。
あと図は、
*----*----*----*----*----
0   1   2   3   4   5
です。

543 :
ふーむ,なるほど。
では,ちょっと質問を変えてみますと,オーディオ/サウンド
関連の分野では常識としてどうすべきかというものがあるので
しょうか?
それとも,ソフトや機器によって実装はマチマチなのでしょう
か?

544 :
固定少数は分数と考えればいいよ。
分母ができほど制度が高くなるイメージ。

545 :
>>540
まあ浮動小数点で扱うなら32768とかで割らなくてもいいんだけどね
オーディオ入出力のAPIによっては浮動小数点を選択すると-1.0〜+1.0になってることが多いね
16bitデータをそのままQ15フォーマットの固定小数点データとみなせば-1.0<=x<1.0となる
>>543
細かいところはまちまちでしょう
ただPCでは飽和処理を自動でやってくれないので自分でやること
float x;
short y;
if (x<-32768.0) y=-32768; else if (x>32767.0) y=32767; else y=(short)x;
とかね
そういえば>>512を気にする場合は
x=x+32768.0;
if (x<0.0) y=-32768; else if (x>65535.0) y=32767; else y=(short)((unsigned short)x-32768);
とかかな?

546 :
>>545
なるほど。
大変参考になりました!
ありがとうございます。

547 :
HTKを使ってHMMをつかっての音声認識をしてるんですけど、
ケプストラムからスペクトル包絡を求めたいとおもってるんです。
で26次元のケプストラムから求めるには32ポイントでのフーリエ変換して指数変換でいいのですかね。

548 :
FFTじゃないスペアナってないかね?
低域の分解能がほしい。時間分解能もほしい

549 :
スペクトルではないけど、ウェーブレットでも似たことはできる。

550 :
ブラウザだけで波形を生成して音を出すことに成功したぜ〜
http://www42.atwiki.jp/syugyou?cmd=upload&act=open&pageid=250&file=oto2.html

551 :
Javascriptだけででバイナリ作るとか怖いFlash要らないな

552 :
exeならいいのかとかFlashに何の関係がとか

553 :
exe?riffだろ常識的に考えて…

554 :
研究用音声サンプルが萌える件
ttp://www.it.ice.uec.ac.jp/SRV-DB/
ギャルゲから音声抜き出したのかとw

555 :
>声優によるオリジナル原稿の読み上げ

556 :
声優パートを試し聴きされる方へ
データの種類が多すぎて,どこから聴いたら良いかわからないという方のために, 「おすすめ」を書いておきます.
まず,どんな発話内容であるかその全体を把握したいという方は,ステレオで聴ける方は, 自然な話速での
男女ステレオデータ:5分45秒:第1回収録版 もしくは 同:第2回収録版をお聴きになってみて下さい.
モノラルでしか聴けない方は, 自然な話速での男女モノラルデータ:5分45秒:第1回収録版)
もしくは 同:第2回収録版をお聴きになってみて下さい.
なお,研究素材として用いるために, 音声データにはコンプレッサなどで音圧を上げる処理を施しておりません.
CDなどで言えば,マスタリング工程前のデータということになります. このため,全体として音量は小さめですので,
パソコン側の音量を最大にして試聴して頂ければ幸いです. ボリューム最大でも音量が足りないパソコンをお使いの方は,
簡易コンプレッサで音量を上げた 大音量版:ステレオ:5分45秒:第1回収録版をお聴き下さい.
無処理ならではの伸び伸びとした魅力は失われますが, 全体の感じはつかめると思います.

557 :
著作権等に関する注意
音声の研究の進展のため,あるいは,信号処理技術の発展に寄与するためであれば, 広く利用を許可したいと思います.
ぜひ,企業や大学での研究で,素材として使って頂ければと思います. また,学会発表,展示会発表などにおいて,
本データを信号処理したもの,あわせて,比較のために本データそのものを 参加者に聴かせることは可能です.
新製品や新技術や技術改良の効果を具体的にアピールするために, 本素材と本素材をその技術で処理した結果の音声を発表
(学会,展示会,Webページに掲載,CDとして配布) することも許可したいと思います.
どうぞ,技術の進歩のために有効にお使いになって下さい.
なお,役者志望の方が 練習または評価を受ける目的で本データベースを利用するようなことは構いません.
たとえば,対話型の音声の片方に自分の声を挿入するなどです.
データセット3のように音楽を付けたデータを製作し発表することも含め, 良識の範囲内であれば許可します.
ちなみに,データセット3の音楽は, 本データベースのために作曲し製作したオリジナルソースです.
音声の基準(2つ上の段落で説明した基準)の範囲内であれば, 発表や展示やWeb掲載に利用可能です.
BGMが加算されたソースに対する音声認識や話速推定などの研究で, 標準ソースとして利用していただければ幸いに存じます.
原稿「雪」については,本データベース用のオリジナル原稿ですので, 原稿そのものについては,
その一部または全部を許諾無しに無料で利用(読み上げ,テキストの掲載や印刷や配布など) してもらって構いません.
ただし,「雪」と読売新聞の「編集手帳」の発声データについて, 意図的に原稿とは違う意味になるように
編集することはお断りします.
(続く)

558 :
公序良俗に反する利用を禁じます. 声優の方々やアナウンサー方々は, 音声研究の進展のためになることを理解して
協力して下さっていますので, 発声して下さった方々に迷惑がかかるような行為があった場合は,
必要な処置をとらさせて頂きます.
義務ではありませんが, 本データベースの音声や原稿を利用したものを発表・配布する場合は,
「話速バリエーション型音声データベース(SRV-DB)を利用した」 もしくは, 「SRV-DBを利用した」 ことを
書き添えて頂ければ幸いに存じます. 定期的に「SRV-DB」でWeb検索し,本データベースが 期待どおりに
皆さんに活用して頂いていることがわかれば, 今後,さらに充実したものにしていきたいと思っております.
謝辞
声優による読み上げに関しまして, 第1回収録に出演して下さいました,男性声優VM00様,女性声優VF00様には,
非常に遅い音声から,非常に速い音声まで,かなりの幅があったにもかかわらず, どの話速でも魅力的で心のこもった
聞き応えのある音声を発声して頂きました. お陰さまで,本データベースは研究用としての価値はもちろん,
聴くだけでも音声の素晴らしさを味わうことができる大変充実したものになりました. ここに深く感謝いたします.
また,第2回収録に出演して下さいました,男性声優VM01様,女性声優VF01様には, さらに,第1回収録での
発話ペースにあわせて発話して頂くという条件で収録させて頂きました. このような難しい条件にもかかわらず,
個性的で魅力的な役を演じて下さいました. その結果,全く同じ発話速度に制御された上で,異なる男女の
ペアの方々が それぞれ個性あるキャラクターを演じて下さっているという, 貴重なデータベースを完成させることが
できました. ここに厚く御礼申し上げます.
(続く)

559 :
さらに,本研究の意義をご理解下さいまして, 声優の方々へ我々にかわって事前説明をして下さいました 芸能事務所の
チーフマネージャー様に厚く感謝いたします, 氏のご協力なくしては,データセット1〜3はここまで充実させることは
出来なかったと思います. ここに厚く御礼申し上げます.
その他,発話のプロフェッショナルによる読み上げ(データセット4と6)に関しましては,
株式会社エス・オー・プロモーションのご協力を頂きました. 本研究の意義にご理解下さいました佐藤邦宏様,
話速を厳密に管理して発声して頂くというたいへん難しい注文に 応えて下さいました,落合こず恵様(話者PF00),
小松上花様(話者PF01), 山田直広様(話者PM00)に感謝いたします. また,編集手帳につきましては,
読売新聞社より,文章掲載と 音声ファイル公開の許可を頂きました.ここにお礼申し上げます.

560 :
なんで違うファイルに同じファイル名付けるんだ?馬鹿じゃねーの?

561 :
長文いらない。

562 :
リンク先見りゃわかるのにわざわざコピペするって馬鹿じゃね

563 :
音声を分解して、分解した音を選んで削除するのってできますか?

564 :
>>563
DFT(FFT)+IDFT(IFFT) でなんとかなりませんか?

565 :
>>564
大変忙しいので、音声を分解するソフトを作ってもらえませんか?
お願いします。

566 :
ここのスレってうpろだ無いん…

567 :
分解ってのは楽器ごとに分解?
それとも周波数成分ごとに分解?
楽器ごとなら非常に難しい
NMFとかで調べてみるといいかも
周波数成分ごとならいらない音を
フィルタで除去すればいい
ノイズだけ除去ならスペクトル減算法とかある

568 :
特定の周波数を削る3タップのノッチフィルタだよ(俺言語)
周期=レート/周波数;
c=2*円周率/周期;
e=cos(c);
f=sin(c)/(2*精度);
無限インパルス応答(配列,1,-2*e,1,1+f,-2*e,1-f);
function 無限インパルス応答(配列,b0,b1,b2,a0,a1,a2){
var x0,x1,x2,y0,y1,y2,i;
var len=配列の長さ;
x0=x1=x2=y0=y1=y2=0;
for(i=0;i<len;i++){
x2=x1;x1=x0;x0=配列[i];
y2=y1;y1=y0;
y0= (b0*x0 + b1*x1 + b2*x2 - a1*y1 - a2*y2)/a0;
配列[i]=y0;
}
}
引数を変えるといろんなフィルタができるよ
ググればでるよ

569 :
どうでもいいけどちょっといい?
見るからに双二次フィルタだけど、3タップって言うの?

570 :
俺言語っていってるんだから何でもいいんじゃね?

571 :
0デシベルでもDACでクリップするからマイナス何デシベルにしなければいけないって本にかいてあったんですけど
ほんとうですか?

572 :
画像解析と音声解析はかなり似た技術だ。前者の知識が後者で役立つことも多い。
可変閾値、フーリエ変換しかり。ゆえに音声の学習が終わったら画像処理も
勉強しなされ。ヒューリスティックな音声解析のソフトが少ないので諸君の
研究テーマにしてはいかがだろうか?

573 :
>>571
DAC内蔵のオーバーサンプリングとかのデジタルフィルタがあれば
そこでクリップする可能性はあるね
でもかなり高い周波数で相当変なことしないと大きく飛び出ることはないよ
普通は気にすること無いと思う

574 :
>>565
買ってこい
http://www.roland.co.jp/products/jp/R-MIX/
ステマが済んだら能書き垂れてねえでどっか行け

575 :
フーリエ変換を10倍速くする新アルゴリズムをMITの研究者たちが開発
ttp://jp.techcrunch.com/archives/20120118improvement-on-age-old-mathematical-principle-could-yield-improved-images-video/
リンク先の論文読んだけど俺にはさっぱり理解できなかった
数学詳しい人ならこれ見ながらC++でアルゴリズム書けるのかと思うと羨ましい

576 :
可逆圧縮には使えなさそうな印象。

577 :
10倍といっても、いままでO(10f(n))だったのがO(f(n)に)なっただけだからな
10乗とかなら意味あるけど。

578 :
このスレサウンドプログラミングなのに音出るプログラムアップしないよね

579 :
同意。フィルターの使い方みたいなのばっかで…
>>568みたいなのがもっと増えて欲しい

580 :
>>578
>>579
自分のこと棚に上げるなよw
知らないなら質問すれば?

581 :
アップローダからつくらんと…

582 :
この手のは言いだしっぺがやらなきゃ誰も動かんよ

583 :
オイオイ>>568こそが「フィルターの使い方みたいなの」にモロ該当するだろ
実装が欲しいだけなら某cookbookでも参照しろよ
音出したけりゃ今のところ基本波形はBandlimited Synthesisでファイナルアンサーだし
あれ、語ることもう無くね?

584 :
1bit(2.8224MHz)→PCM(44.1kHz)の手順が知りたいのですが。
1または0のDouble値をFIRのLPFに渡してDouble値を貰う。
64サンプル毎にもらったDouble値を出力する
って事であってますか?

585 :
>>584
スレ内くらいは検索しようや >>446-

586 :
>>585
>446の流れは読んだつもりですが、わかりませんでした。
スミマセン。

587 :
>>586
1bit のデータは一つ前の値に対して-1なのか、 +1なのかを記録してるのは理解してる?
pcmは今の値が幾つなのかを記録してる

588 :
リンク先にソースつきのプログラムあるのに
同一人物としか思えない

589 :
>>587
ありがとうございます。
では、1または-1の値をFIR-LPFフィルタに渡すということでよいのですね?
その結果の値がマルチビットになるのでしょうか?(もしそうだとすると1bitの入力なのになぜマルチビットが返ってくるのかわかりませんが)
そうであれば、1/64に間引きして出力すると44100HzのPCMが出来るという事になりますか?
>>588
ソースコードへのアクセスの仕方がわかりませんでした。

590 :
あきらめたら?

591 :
>>589
理解まったくできてないようだね
数値とグラフを書いてみなよ
可視化するとわかりやすいよ

592 :
>>591
>数値とグラフを書いてみなよ
何の数値とグラフを書いたらよいのでしょう?
下記の処理はできるようになりました。
1.PCMデータ入力
2.FIR-LPF
3.PCMデータ出力
1ビットずつデータを取り出す事はできます。
1と-1の連続したデータを次にどうすべきなのでしょうか?





593 :
x+=1
x-=1

594 :
>593
値を加算して累積させていくということですね。
ここまではOKです。
思いつきで、1bitの入力データをshort型の配列に加算しながら格納しました。
44100HzのPCMにするため、単純に1/64に間引き(64サンプルごとに値を出力)してWAVファイルとして保存しました。
音として確認できるものはできたのですが低音のみで、4kHz以上の周波数成分は出力されていませんでした。

1bitの累積値の配列は何型に保存すべきでしょうか?
Long,Integer,Short/Single(float),Double
次にこの累積値の配列をどうすべきでしょうか?
ご指導いただけると助かります。

595 :
1ビットデータ(1または-1)をFIR-LPFのバッファ(doubleの配列)に格納し、64サンプル毎に値を取り出して出力しました。
FIRの係数は
ttp://achapi2718.blogspot.com/2001/04/fir-javascript.html
を使用して、作成しました。
FIR-LPFのタップ数:513
サンプリング周波数:2822400
カットオフ周波数は22050
音がはっきり聞こえるようになってきました。しかし、盛大に「シャー」というノイズがのっています。
係数作成時の指定が悪いのでしょうか?
どなたかご助言をいただけるとありがたいのですが。

596 :
>>595
まず1bitデータがちゃんと作れてないと思う
フィルターは確か3TapのIIRだった記憶がある
sonyの論文に載っているが、何処にあるか覚えてない

597 :
ちなみにノイズが40kHz以上なら正常だよ
大抵の1bit audioはすべて40k以上のノイズ吐いてます。
再生できるスピーカー少ないし、聞こえないし、測定も難しいから気にするな

598 :
>>596>>597
ありがとうございます。
FIR-LPFをひたすら追いかけていましたが、IIRなんですね。
まずはIIRの勉強をする事にします。
>まず1bitデータがちゃんと作れてないと思う
フィルタをかける前の1bitデータに問題があるという事でしょうか?
もう一度見なおして見ることにします。

599 :
>>596
わー! できましたー!
>まず1bitデータがちゃんと作れてないと思う
LSBファーストの意味を間違えてたみたいです。逆に配列したらノイズのない22kHzまでノイズのないデータができました。
ありがとうございます。
これから色々と音質を調整したいと思います。
本当にありがとう。色々とアドバイスをいただいた他の皆さんにも感謝です。

600 :
質問させてください。
DTMで使う簡易daw的なソフトを作ろうと思っているのですが、
vsthost,midiシーケンサーの2つの機能は最低限内包したいと思っています。
そのソフト内で
midiシーケンサー → vsthost
のような流れでmidi信号の通信が発生すると思うのですが、
このmidi信号の通信を行うために仮想midiケーブル的なプログラムを書かなければいけないのかな?
と思い当たりました。
参考になりそうなソフトはないかと色々調べてみたところ
midiyokeなど他にも色々見つかったのですが
例えば
http://www.johnrofrano.com/tutorials/virtualmidirouter.htm
ここのソフトだと、インストールする際、レジストリへの追加が発生している(ハードウェアの追加の部分で)
ようです。
しかし、欲しいのはあくまで自作プログラム内でのmidi通信用の仮想バスなので、
自分の場合はわざわざレジストリに登録するようなソフトにしなくてもよいのではと思ったのですが
自信がありません。(windows multimedia library とかの絡みでレジストリ登録は必須なのでしょうか)
このあたりのことについて教えていただけないでしょうか。
また、仮想midiケーブルを開発するにあたって参考になるページなどありましたら教えていただけると幸いです。
よろしくお願いします。

601 :
いきなり出だしから間違えてる
まずDAW内でMIDI"信号"そのもののやり取りは発生しない
MIDIイベント構造体でやりとりすればいいだけ(正確にはVstEvents*)
初っ端からそんなんで大丈夫か?

602 :
レスありがとうございます。
VstEvents*について調べてみました。
http://www39.atwiki.jp/vst_prog/m/pages/77.html?guid=on
ここのページを見ると、VstEvents*を引数に取る関数として
processEvents()
が挙げられており、その説明文に
「MIDIメッセージをホストアプリケーションから受け取る関数」
とあります。
この説明文を見て、これは
VSTホストアプリケーションからVSTiアプリケーションに
MIDIメッセージ(VstEvents)が送られた際、VSTiアプリケーション側が
MIDIメッセージを取得するための関数、と理解しました。

603 :
そこでまた疑問なのですが、ここでいうVSTホストアプリケーションは、
「MIDIメッセージを送信するタイミングを時間軸で管理して適切に送信する」
機能も兼ね備えているもの、なのでしょうか。
自分のイメージでは
SMFファイル → Midiシーケンサー → VSTホスト → VSTi
      load midimsg送信 VstEvents送信
という感じで、VSTホストとVSTiとの通信する際VstEventが使われるが、
MidiシーケンサーとVSTホストが通信する際には実際のMIDIメッセージがやりとり
されているのではないかと思ったのです。
このような感じで、自分が作りたいのはVSTホストなので
midi通信用のプログラムが必要なのでは、と思ったのですが、
この構図は間違っているのでしょうか。
VSTホスト自体がMIDIシーケンサーの役割も果たしているのでしょうか?
ご教示いただけると幸いです。

604 :

SMFファイル → Midiシーケンサー → VSTホスト → VSTi
       load       midimsg送信   VstEvents送信

わかりづらくてすみません。
上記のような感じです。
また、
http://www.hermannseib.com/english/vsthost.htm
ここで配布されているvsthostはmidiinに入力されるmidiメッセージを
解析してvstiを鳴らすようになっているようですが、
自分が作ろうとしているのは、
1つのアプリケーションの中でSMFファイルのロードからして、
vstiを鳴らすまでやることができるようなものをイメージしています。
よろしくお願いいたします。

605 :
日本語が難解で何をやりたいのか頭に入ってこない。もう少し簡潔に書けない?

606 :
VstEvents* は VSTHostとVSTiの通信に使うもので、
MIDIシーケンサーとVSTHostの通信の際には
生のMIDIメッセージのやりとりが必要なのではないか?という疑問です。
ただ、VSTSDKの中にMIDIシーケンサー用のプログラムが用意されていて、
それをVSTHostの中から呼べるようになっていたりするなら、
わざわざMIDIシーケンサーや仮想MIDIケーブルを自前で用意する必要もない気がするのですが
そのあたりのことがわからないので教えていただきたいのです。
自分が作りたいものはSMFをロードして音源としてVSTiを使用して音楽を再生する
簡易DAW的なものです。

607 :
日本語は分かるし、何をやりたいのかも分かるが
途方も無い勘違いをしているのでどこから正していけばいいのか・・・というより
>>601で解決しなかったので驚愕ってとこ
VSTホストは自分で実装するんだよな?
アプリのvsthostをそのまま使うわけじゃないんだよな?

608 :
いろいろと壮大な勘違いだらけ。
midiシーケンサーはmidiイベントを出力するもの。
midiシーケンサーでvstiを鳴らすにはmidiイベントをvsteventsに変換しないとvsthostが受け付けない
vstiの音はデジタル信号なのでシーケンサーとは時間(クロック)同期しないといけない。デジタルだから。
midiでvtsiを鳴らすだけならvsti対応のmidi playerであってdawではない。簡易dawはmidiは扱わない。オーディオのみ。
仮想結線するのと、ソフト内部でmidi信号をvsteventsに変換してシーケンスするのは広義では同等。しかし、これを仮想Midiケーブルなんて発想には普通はならない。
vsti とsmf以外はすべて自前で用意しないと駄目。midi playerとvsthostが内包したソフトを作るのでしょ?その二つが内包しているのに、それらを繋ぐ部分(仮想ケーブル?)を用意するってどのような発想?

609 :
「自分は頭が良くて詳しいです」的な自己満足レスの典型だぞ。
相手は超初心者なんだからもう少し優しく教えてあげないと。
さもなくばスルーでOK

610 :
MIDIは実際わかり辛いけどなw
シーケンスファイルも通信データもケーブルも全部MIDI付くから
まずMIDIの解説サイト熟読してMIDIメッセージとsmfファイルフォーマット理解しないと無理じゃね

611 :
そういう話だったか?

612 :
レスありがとうございます
>>607
>アプリのvsthostをそのまま使うわけじゃないんだよな?
参考になりそうなところがたくさんあるみたいなのでソース見て色々調べていますが、
全部そのまま流用という感じではないです。
>>608
>midiでvtsiを鳴らすだけならvsti対応のmidi playerであってdawではない。簡易dawはmidiは扱わない。オーディオのみ。
なるほど。
>仮想結線するのと、ソフト内部でmidi信号をvsteventsに変換してシーケンスするのは広義では同等。
これもわかりやすい説明ありがとうございます。
つまりmidiシーケンサー(≒midiプレイヤー?)側でmidiメッセージをVstEventsに変換して、
仮想midiケーブルなんてものを通さずに直接Vstホスト側に渡してしまえばいいという理解で合っていますでしょうか?


613 :
>midi playerとvsthostが内包したソフトを作るのでしょ?その二つが内包しているのに、それらを繋ぐ部分(仮想ケーブル?)を用意するってどのような発想?
dominoとVstHostを連携させる時にMidiYokeが必要だったので、仮想midiケーブルに該当するものが必要なのかなと思ったのです。
dominoとVstHostを連携させるときはdominoにはvst関連の機能はないようなので、
domino側で生のmidiメッセージを出力してVstHost側でmidiメッセージからVstEventsに変換しているという感じでしょうか。
自分で開発する際の参考にしたいのですが、midiメッセージをVstHostに送る前にVstEventsに変換しても、
VstHostに送ってから変換してもどちらでも大丈夫なのでしょうか(単純に設計による感じな気もします)

614 :
全然関係ないけど仮想ケーブルと言われるとreasonが頭をよぎる

615 :
vsthostとmidi playerは別のソフトとして作るの?
一つのソフトならどこで変換しても同じじゃないの?
ソースのここからはvsthostって分けるのは勝手。何を心配しているのかわからない。素人プログラミングならソースを書いていろいろ試した方が、ここで調べるよりためになるよ。
仮想ケーブルはイレギュラーなものだから忘れた方がいいよ。きみの作りたいものは普通のソフトみたいだから

616 :
えーとさ、まずVST SDKの仕様書を読めよ
そうすりゃ今までバカな質問してたってことがはっきりするから
勝手に仕様を想像して、その想像を元に質問してるから(俺らの)話が通じないんだよ
はっきり言って埒があかねえ

617 :
自演乙

618 :
シッタカの自作自演うぜえな
その程度の知識で自慢したいわけ?

619 :
何これコント?ワロタ。
わざとすっとぼけた事言っているようにしかみえんw
自演じゃなかったら、からかわれてるんじゃねーの?

620 :
とんでもないバカは実在するんだよ。

621 :
>>617
いえいえ

622 :
お礼のレスが遅れましてすみません。
>vsthostとmidi playerは別のソフトとして作るの?
いえ、同じソフトとして作ろうとしています。
ですので、仮想MIDIケーブルのようなものは全く必要なく、
VstEventsをmidiシーケンサー側で時間管理して正しいタイミングで
VstHostに送ればよいだけですね。
色々とよく分からない勘違いをしていたようで失礼しました。
>まずVST SDKの仕様書を読めよ
vstの仕様書とは
http://www.gersic.com/vstsdk/
これでしょうか。
いろいろ読んで勉強してみることにします。
アドバイスありがとうございます。
また何か質問させていただくことがあるかもしれないですが
よろしくお願いします。

623 :
いえいえ

624 :
マイクで拾った音をライン入力から取り込んで
音の強さをデシベル表記で騒音データベースに記録し続けるようなシステムを
開発しようと考えています。
そこで疑問なのが、ライン入力とデシベルの換算部分です。
ソフトで取り込んだPCM波形強さはマイクの感度やオーディオボードのADC、
またWindowsでしたらボリュームコントロールなど
様々な個所で音量調整されます。
正確にデシベル数を入力したい場合に何か良い方法はないでしょうか?

625 :
実測校正。
測定器なんてそんなもん。

626 :
なるほど。実測校正ですか。
そうすると正確に指定したデシベルの騒音だせる機械が必要になるのかな
売ってるのか不明だけど。


627 :
だったらログ機能のついた測定器買った方が安いって話だわな

628 :
>>626
http://www.onosokki.co.jp/HP-WK/products/keisoku/soundvib/sc3100a_2120a.html
マイクサイズが1/2インチか1/4インチじゃないとダメだけどね。
ピストンフォン買うと気圧計もついてくる。気圧変動も考慮して自分で調整。
JIS規格によると結局は比較校正になる。ピストンフォンはマイクが嵌らないと意味ないので、大抵は校正された騒音計の値に合うよう調整する。小数点以下一桁がなんとなく合っていればいいと諦めるのが大事。

629 :
自動作曲ソフトを作りたいんだが本格的な作曲アルゴリズムを考えてくれ

630 :
まずは自分で調べろよ。

631 :
http://www.nicovideo.jp/watch/1345807634

632 :
>>630
調べても出てこないんだよ

633 :
>>631
それ本格的じゃないだろう

634 :
>>632
調べ方が足りないなー。
古典的だけど、まずはGTTMあたりから勉強してみたらどう?

635 :
復帰テスト

636 :
>>634
それなに?

637 :
原書
Lerdahl and Jackendoff : A Generative Theory of Tonal Music. MIT Press(1983)
説明
ttp://www.asahi-net.or.jp/~NM7Y-TKUC/4-61.htm
動いてるのがあるところ
ttp://music.iit.tsukuba.ac.jp/hamanaka/index_j.html
こんな感じですか、わかりません><

638 :
ハウリング除去のアルゴリズムを基礎からまとめたサイトとか文献とかがあれば教えてほしい

639 :
http://www.gem.hi-ho.ne.jp/katsu-san/audio/next_gen/digital.htm

640 :
基礎からではないけど、ハウリング除去というかエコーキャンセラまで載ってる。
http://www.coronasha.co.jp/np/isbn/9784339011258/

641 :
SMFプレイヤーを実装するためのユーティリティ(再生、途中停止、途中再生、シーク など)
が揃っているC++のライブラリってありますでしょうか?
Synthesis Toolkitとか調べてみてSMFをloadするクラスは見つけたのですが、
上記のような機能を有したクラスは見つかりませんでした。
ご存知の方いらっしゃったら教えていただけると嬉しいです。

642 :
「MIDI C++ codeproject」辺りでググれば山ほどヒットするけど、
なかなか「これは」というものに出会わないね。
MIDI APIは、オーディオに比べ自由度が高すぎるのが原因だろうね。
結局、シーケンサーを作っている人は、自分用のMIDIライブラリを書いていると思う。

643 :
レス有難うごさいます。
なるほどです。
では自作する場合について試行錯誤してみたのですが、
以下2パターンの方式を考えました。
1. 読み込んだSMFデータからすべてのトラック内のmidiイベントを
シーケンシャルに並べ直し、midiイベントごとに再計算されたデルタタイムと
共にデータを格納された配列のようなものを作り、
whileループ内でsendMidiMessage()とsleep(deltatime) を繰り返す
2. 読み込んだSMFファイルからトラックごとにスレッドを生成し、
そのそれぞれの中でsendMidiMessage()とsleep(deltatime)を繰り返す


644 :
最初2の方がよいのではと思ったのですが、
この実装方式だと途中再生やシークの実装ができないような気がしてきました。
1の方だと途中再生もシークも可能だと思うのですが、
>すべてのトラック内のmidiイベントをシーケンシャルに並べ直し、
>midiイベントごとに再計算されたデルタタイムと共にデータを格納された配列のようなものを作り、
この部分の実装に結構手間がかかるのでは・・と危惧しています。
1の方式で正解なのでしょうか。
>すべてのトラック内のmidiイベントをシーケンシャルに並べ直し、
>midiイベントごとに再計算されたデルタタイムと共にデータを格納された配列のようなものを作り、共にデータを格納された配列のようなものを作り、
この部分を行なってくれるライブラリのようなものがすでにあればよいなと思うのですが・・
アドバイス頂けると嬉しいです。

645 :
なんか難しく考え過ぎているような気がする。
とりあえずSMFの解析結果をダンプしたり、実時間で少しずつイベントを処理していくだけような
簡単なプログラムから始めたほうが理解が進むんじゃないかと。
ちなみに1の手法として書かれている配列って、
もしかしてtick単位で展開された全演奏データを並べた配列をイメージしてる?
短い曲ならまだしも、分解能が大きかったり演奏時間が長かったりしたら
配列の要素数が爆発しそうな予感がする。間違ってたらゴメン。

646 :
レスありがとうございます。
tick単位で展開された全演奏データ、の意味するところがよくわからなかったのですが、
全てのトラックの全演奏データの配列で、
配列の要素は1つのmidiメッセージとそのデルタタイムを
格納した構造体をイメージしてました。
つまり全トラックに含まれているMIDIメッセージの数が
配列の要素数と同じになる感じです。
こうして一元管理しておかないと途中再生やシークができないと思ったんですが、
イベントごとのタイムを最初から全部計算しておけばいいような気もしてきました。
デルタタイム分スリープさせるという考え方は合ってはいるのでしょうか。

647 :
前winで実装したときは再生用スレッド1本用意して、
・各トラックに処理すべきメッセージがあれば必要なだけ処理しポインタを進める
・1msecのスリープ(事前にtimeBeginPeriod(1)必須)
・全てのトラックがEOTにたどり着くまでループ
デルタタイムでスリープ再生すると、恐らく絶対時間が合わなくなる
あとはシークも盛り込むのであればノートon/offだけ無視して時間進められるようにするか、
擬似的に状態保持するとか、多少考える必要がある
あと厄介だったのは曲中のテンポチェンジかな
時間経過をデルタタイム換算で処理していくなら問題ないけど、
事前にデルタタイムを実時間に変換するなら注意

648 :
メロディレイザー1999の作曲アルゴリズムはどんなアルゴリズムを使っているの?

649 :
メロディレイザー1999の作曲アルゴリズムはどんなアルゴリズムを使っているの?

650 :
>>646
後半変なこと書いて申し訳ない。
ともかく言いたかったのは>>647でも書かれてるように
デルタタイムのような相対時間をわざわざ絶対時間に換算しなくても
処理できるんじゃないかな、ってことです。
>>647
巻き戻しできるプレイヤーを作ったことがないので想像ですが、
通常のイベント処理時は状態変化の履歴を蓄積していって、
巻き戻し時はその履歴をさかのぼって処理しなおしていく感じで
過去の状態を再現する感じなんでしょうか?
テキストエディタのUNDOバッファや、各種アプリの操作履歴みたいな感じで。

651 :
実際のMIDI機器相手だとエクスクルーシブ等送信順序で動作が色々異なるので
・各種リセットメッセージ
・先頭からシーク位置までのノートon/offメッセージ以外の全てを送信
ってやってた
バンクやプログラム、その他の全ての状態を一回通読して必要最低限だけ送るってのがスマートではあるけど、
実機相手だと上手く動作しないmidがあったので、当時上記実装でお茶を濁した
まぁそのへんはmidファイルや再生機器次第かと

652 :
>>651
なるほど、ありがとうございます。
>>650を書いた時点ではプレイヤー側が全状況を把握して、
巻き戻しで状況を遡って再現していけばいいかなと思ってましたが、
現在の再生位置に無関係な任意の位置へのシーク、と考えれば
頭からの再生し直す方が実装も一つにできますし、素直な方法だと思います。

653 :
http://aimp.coolverse.jp/bh2ch.pdf

654 :
レスたくさんいただきましてありがとうございます!
かなり参考になりました。
とりあえず再生用スレッドを用意する方式で実装し始めてみたいと思います。
また何かわからないことが出ましたら質問させていただきたいと思っていますので
お答えいただけると幸いです。

655 :
ちょっと質問です。
Windows で OpenAL を使いたいのですが、
最近、OpenAL11CoreSDK を公式から落とそうとしても、500 internal server error が出て落とせません。
何か原因、もしくはミラーサーバなどご存知の方はいないでしょうか?

656 :
普通にできるけどな。
ブラウザ変えてみては

657 :
過去質問させていただいた者です。>>641-654
いただいたアドバイス等に従いまして、TSE3 というMIDIシーケンサーライブラリを見つけ、
Windows XP 上で SMFをロードして内蔵Midi音源にmidiメッセージを飛ばして
音を鳴らすところまでできたのですが問題も発生しており、
また質問させていただきに来ました。

658 :
上記の通り、シンセの音を鳴らすところまでは行ったのですが、鳴らした結果が以下になります。
http://ux.getuploader.com/sience1_20/download/234/20121025+210212.m4a
それっぽいものは鳴っているのですが、ブツブツ切れてしまい全く正常に再生できていません。

659 :
一番最後で音が伸びているのは強制終了させているからなのですが、
ノートオフメッセージを飛ばす前にプログラムが終了しているからなのかな?
と見当を付けています。が、であれば途中が切れているのはなんなのだろうと・・

660 :
ノートONとOFFが極短い間隔で送られてるように聞こえるけど、最後まで再生したときSMFの尺と合ってる?
あとはランニングステータスの処理ミスで送信チャンネルがおかしくなってるとか
音は鳴ってるんだし、フルのSMFだとデバッグし辛いだろうからドレミの3音だけ鳴らすような単純なSMF作ってトレース実行してみては?

661 :
レスありがとうございます。
なるほどその方法でトレースしてみます。
ちなみにソースコード的にはざっくりと以下のような感じです
timeBeginPeriod(1);
do
{
transport->play(smf, startClock); // TSE3ライブラリ使用
transport->poll(); // TSE3ライブラリ使用
Sleep(100);
} while (true);
timeEndPeriod(1);

662 :
>>661
transport->play()が無限ループの内側にあるのは書き間違い?
TSE3 0.3.1のサンプルを見ると外側にあるけど。

663 :
transport.play関数の役割を理解してる?
transport.status関数をなぜ使わない?

664 :
レスありがとうございます。
サンプルコードまで見ていただいたようでして、本当にありがとうございます。
その後調査を進め少し進展があったのですが、また詰まってしまっています・・。
何度も恐縮なのですが、よろしければまたアドバイスをいただけますと幸いです。
長文になってしまうのでpastebinに文を貼り付けました。
ご覧頂けると嬉しいです。
http://pastebin.com/FdWfrqUM

665 :
質問内容がドキュメント完備されてるライブラリの基本的な使い方なら、流石にこのスレの範疇外だと思うがなぁ
ttp://tse3.sourceforge.net/doc/Article.html
ここの Examples of using TSE3 に再生方法書かれてるから、まず永久ループをなんとかしろ
それと startClock の値は?
transport.play の第二引数は再生開始位置だから
src/examples/midifile/midifile.cpp(74行)見る限りじゃ整数型で 0 渡せばいいはず
ライブラリソースに手加えてるなら作業前に全部元に戻す事

666 :2012/10/29
とりあえず>>665が挙げてるmidifile.cppのサンプルをそのまま動かしてみるとか。
midifile.cppの中身もシンプルだから悩むところは少ないんじゃないかな。
TOP カテ一覧 スレ一覧 2ch元 削除依頼
Java低速GUI Swing & JavaFX 10 (371)
MFC、Win32++を超えるライブラリを作るスレ (944)
C言語なら俺に聞け(入門編)Part 109 (392)
★初心者にVisual C++を教えるスレ★ Part38 (630)
リファクタリングをただのコード修正と思ってる人へ (274)
datファイルを共有するP2Pソフト o2on 17dat (371)
--log9.info------------------
キャラメイクの自由度が高いゲームを語るスレpart8 (334)
過大評価がすぎるゲーム2 (987)
【筋トレは】荒木美鈴スレ Part3【360で】 (743)
クソゲーだけど好きなゲーム (422)
電撃PSを買う&作る人って、何故バカばかりなの?6 (917)
今までやった中で一番つまらないクソゲー教えて (496)
ソニーブログはちまと角川(アスキー電撃ファミ通)の関係性★18 (373)
乙女ゲー的クソゲーオブザイヤーを決めようぜ31 (688)
【MH】モンスターハンター強さ議論スレ Part4【モンハン】 (846)
RPGツクールでゲーム作るぜ! Part22 (491)
ヒントを挙げて何のゲームか当てるスレ (213)
SCE「PS3は大失敗ハード、反省点ばかり」 (942)
名前が思い出せないゲームを誰かが教えてくれるスレ24 (272)
よく考えたらおかしいと思うゲームの設定あげてけ (602)
ニンテンドー3DSLLを語るスレ (217)
彼の家に行ったらプレイステーション2があった (277)
--log55.com------------------
このルートの人間はパラレルワールドを信じるか?
アセンションはすでに始まっているphase227
山梨7歳女児行方不明事件5
【おみくじ】オカルト神社その40【!omikuji】
人工地震187
【0,,0】グロ総合スレ Part361【0,,0】
祖父が夢枕に現れました【霊感?】
【マンデラ】現実と違う自分の記憶48【宮尾すすむ】