トップページ > 記事閲覧
サウンドの正弦波描画について
名前:mem 日時: 2022/10/13 14:19

初めまして。 サウンドの波形の描画に関する質問なのですが、 音声編集ソフトのAudacityのように 読み込んだwaveファイルの波形を正弦波で描画して可視化できるようにしたいのですが、Dxlibでは どのような方法で処理を行えばいいのでしょうか?
メンテ

Page: 1 |

Re: サウンドの正弦波描画について ( No.1 )
名前:管理人 日時:2022/10/13 14:37

Audacity でサウンドファイルを読み込んだ際に表示されるようなサウンドの波形の描画については サウンドファイルを LoadSoftSound で読み込んで音の波形の振幅値を ReadSoftSoundData で読み取って 折れ線グラフとして描画することで実現することができます( Audacity では更に工夫された波形描画となっていますが ) ただ、すみません『waveファイルの波形を正弦波で描画』というものがどのようなものか分かりません 参考になるような画像はありますでしょうか?
メンテ
Re: サウンドの正弦波描画について ( No.2 )
名前:mem 日時:2022/10/13 15:15

伝わりにくくすみません! こちらの画像のようなものをイメージしていましたが cs.miyazaki-u.ac.jp/~date/lectures/2009bis/kadai/gakki/doremi102.png 「waveファイルの波形を正弦波で描画」というより、 そのまま「サウンドファイルの波形の描画」のほうが正しかったですね。
メンテ
Re: サウンドの正弦波描画について ( No.3 )
名前:管理人 日時:2022/10/13 21:34

> こちらの画像のようなものをイメージしていましたが > cs.miyazaki-u.ac.jp/~date/lectures/2009bis/kadai/gakki/doremi102.png すみません、こちらの画像を拝見しようとしたのですが『サーバーから応答が無い』と 表示されてしまい、拝見できませんでした > 「waveファイルの波形を正弦波で描画」というより、 > そのまま「サウンドファイルの波形の描画」のほうが正しかったですね。 了解です Sound.wav を読み込んで波形を描画する簡単なサンプルプログラムを組んでみましたのでよろしければご覧ください m(_ _)m ( 左右キーで波形の表示範囲を移動できます ) #include "DxLib.h" #define SCREEN_W 1280 #define SCREEN_H 720 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { int SoftSoundHandle ; LONGLONG TotalSampleCount ; LONGLONG DrawStartSampleCount = 0 ; // ウインドウモードに変更 ChangeWindowMode( TRUE ) ; // 画面解像度を設定 SetGraphMode( SCREEN_W, SCREEN_H, 32 ) ; // 背景色を灰色に設定 SetBackgroundColor( 64,64,64 ) ; // DXライブラリ初期化処理 if( DxLib_Init() == -1 ) { return -1 ; } // サウンドファイルの読み込み SoftSoundHandle = LoadSoftSound( "Sound.wav" ) ; // サウンドファイルの長さを取得 TotalSampleCount = GetSoftSoundSampleNum( SoftSoundHandle ) ; // 描画先を裏画面に変更 SetDrawScreen( DX_SCREEN_BACK ) ; // メインループ while( ProcessMessage() == 0 ) { // 左キーが押されたら左側にスクロールする if( CheckHitKey( KEY_INPUT_LEFT ) ) { DrawStartSampleCount -= 10 ; if( DrawStartSampleCount < 0 ) { DrawStartSampleCount = 0 ; } } // 右キーが押されたら右側にスクロールする if( CheckHitKey( KEY_INPUT_RIGHT ) ) { DrawStartSampleCount += 10 ; if( DrawStartSampleCount + SCREEN_W > TotalSampleCount ) { DrawStartSampleCount = TotalSampleCount - SCREEN_W ; } } // 画面を消去 ClearDrawScreen() ; // 左チャンネルと右チャンネルを区切るラインを描画 DrawLine( 0, SCREEN_H / 2, SCREEN_W, SCREEN_H / 2, GetColor( 0, 0, 0 ) ) ; // 左チャンネルと右チャンネルのセンターラインを描画 DrawLine( 0, SCREEN_H / 4, SCREEN_W, SCREEN_H / 4, GetColor( 0,0,255 ) ) ; DrawLine( 0, SCREEN_H - SCREEN_H / 4, SCREEN_W, SCREEN_H - SCREEN_H / 4, GetColor( 0,0,255 ) ) ; // 波形を描画 for( LONGLONG i = 0 ; i < SCREEN_W && i + DrawStartSampleCount < TotalSampleCount ; i ++ ) { int Ch1, Ch2 ; // 波形の振幅値を取得 ReadSoftSoundData( SoftSoundHandle, i + DrawStartSampleCount, &Ch1, &Ch2 ) ; // 振幅値の高さの縦ラインを描画 DrawLine( i, SCREEN_H / 4, i, SCREEN_H / 4 + ( Ch1 * ( SCREEN_H / 4 ) / 32768 ), GetColor( 0,0,255 ) ) ; DrawLine( i, SCREEN_H - SCREEN_H / 4, i, SCREEN_H - SCREEN_H / 4 + ( Ch2 * ( SCREEN_H / 4 ) / 32768 ), GetColor( 0,0,255 ) ) ; } // 現在表示している開始位置を描画 DrawFormatString( 0, 0, GetColor( 255,255,255 ), "DrawStartSample : %d", ( int )DrawStartSampleCount ) ; // 裏画面の内容を表画面に反映 ScreenFlip() ; } // DXライブラリの後始末 DxLib_End() ; return 0 ; } ただ、等倍で表示するとサウンドデータの端から端まで見渡すのに凄い長い時間をスクロールしなければいけないので 横方向に圧縮して表示するなど、エディタやビューア的な表示をするには上記サンプルのようなシンプルな作りでは駄目で、 色々工夫と機能の追加が必要です
メンテ
Re: サウンドの正弦波描画について ( No.4 )
名前:mem(解決済み) 日時:2022/10/14 09:46

サンプルの方ありがとうございます!助かります! こちらを参考にいろいろ試してみようと思います。 ありがとうございました!
メンテ

Page: 1 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存