> こちらの画像のようなものをイメージしていましたが
> 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 ;
}
ただ、等倍で表示するとサウンドデータの端から端まで見渡すのに凄い長い時間をスクロールしなければいけないので
横方向に圧縮して表示するなど、エディタやビューア的な表示をするには上記サンプルのようなシンプルな作りでは駄目で、
色々工夫と機能の追加が必要です