スキップしてメイン コンテンツに移動

投稿

gnuplotで曲線を描く

自作デジタルエフェクターではLFOなど可聴域外の周波数を扱う事があります。そういった音声信号はWAVファイルへ出力しても耳で聞いて確認することができません。そのような場合は数値データをそのままファイルに落としてグラフ化ツールなどで可視化して確認します。  gnuplot  gnuplotはフリーのグラフツールです。 gnuplot https://sourceforge.net/projects/gnuplot/files/gnuplot/ gnuplotにはコマンドライン版とウインドウ版の両方が入っています。どちらでも同じように使えますが、ここではウインドウ版を使います。 インストールの際にデスクトップ上にアイコンを作成するにチェックを入れておきます。 インストールが終わったら、デスクトップのショートカットを右クリックしてショートカットのプロパティを表示します。 ショートカットのプロパティで作業フォルダーの中を消して空にします。  グラフ表示してみる  作業の流れは、 ・wgnuplotショートカットを作業フォルダへコピーする。 ・コンソールで標準出力へデータを出力するプログラムを作る。 ・リダイレクトでデータファイルを生成する。 ・gnuplotで表示する。 ちょっと面倒ですけど、こんなものでしょう。ではちょっとやってみましょう。 まず、初めにデスクトップにあるwgnuplotのショーカットを作業フォルダへドラッグ&ドロップでコピーし、作業フォルダからwgnuplotを起動できるようにしておきます。これを作って置かないと起動の度に作業フォルダを指定しなければなりません。 次にサイン、コサインの数値を出力するプログラムを書いてみます。教科書通りの何の変哲もないコンソールに数値を出力するだけのプログラムです。 sine_cos.cpp #include  <iostream> #include  <math.h> main() {   int       fs      = 44100; // サンプリングレート   int       freq    = 1;       // 周波数     int       l
最近の投稿

WAVライブラリ

プログラムで音声フォーマットのWAVファイルが扱えるようになれば、それを読みこんで、エフェクト処理して、それを書き出す、自作のデジタルエフェクターではそれをリアルタイムで行うだけの違いでしかありません。PCでプログラムのひな形を作るのがサウンドエフェクトプログラミングの第一歩となります。  WAVライブラリ   C言語ではじめる音のプログラミング http://floor13.sakura.ne.jp/book03/book03.html サウンドプログラミング入門 http://floor13.sakura.ne.jp/book06/book06.html 良本なのでぜひ両方ともお手元に置いてあげてください。 サンプル音源やソースコードも上記サイトで全公開されています。そのソースコードの中にWAVファイルを読み書きするCプログラムがあるのですが、Cではちょっとアレなので、それをC++で書き直してみました。 wave.hpp(C++) https://github.com/DIYFXWorld/Other オリジナルのソースコードではデータ圧縮もサポートしていますが、面倒なので非圧縮データのみの扱いとしました。  wavファイルの情報を表示する  手始めにwave.hppを使ってWAVファイルの情報を表示するプログラムを作ってみます。wave.hppを同じフォルダにコピーしておきます。プログラムファイル名はwav_info.cppとします。 wav_info.cpp #include  "wave.hpp" main( int argc, char *argv[] ) {   if( argc < 2 )   {     printf( "usage : wav_info file_name.wav" );     return 0;   }   wav_info  wi = get_wav_info( argv[ 1 ] );   puts( "" );   printf( "Sampling rate : %d Hz\r\n", wi.fs );   printf( &qu

MinGWのインストール

 MinGWのダウンロード  本家サイトからダウンロードしてください。 http://www.mingw.org/ トップページのダウンロードをクリックします。 セットアッププログラムをダウンロードします。  MinGWのインストール  既存のフォルダにしかインストールできないので、あらかじめインストールフォルダを作って置きます。今回はE:\MinGWにインストールします。注意点は ・出来るだけ浅いフォルダにインストールしましょう。 ・フォルダ名に日本語や空白は入れないようにしましょう。 ダウンロードしたセットアッププログラムを実行します。Installボタンをクリックします。 インストールフォルダを指定してから、Continueボタンをクリックします。 設定情報のダウンロードが始まるので、終わったらContinueボタンをクリックしてつぎへ進みます。 mingw32-gcc-g++bin と msys-base-bin のチェックボックスをクリックし、Mark for Installtionをクリックして矢印マークを付けます。マークを付けたらメインメニューからInstallation->Apply Changesをクリックします。ダウンロードが終わるまでしばらく待ちます。 ダウンロードサイスは約231Mでした。  MinGW(msys)の起動  MinGW\msys\1.0 ディレクトリの中に msys.bat というファイルがあるのでこれをクリックするとシェルが起動します。ショートカットを作って直ぐに起動できるようにしておきましょう。  ユーザーディレクトリの場所  MinGW\msys\1.0\home\ユーザー名\ がユーザーディレクトリになります。通常はここを起点としてフォルダを掘っていきます。このフォルダにもショートカットを作ってすぐ移動できるようにておきましょう。  C/C++ビルド用スクリプト  C/C++プログラムをコンパイルする為のスクリプトファイルを作ります。 build という拡張子無しのファイルを作って以下の内容をコピーします。 #!/bin/bash path=$1 #echo &

Blue Pill STM32 FX Projects - 簡易サウンドエフェクト・テスト回路 -(2)

Blue Pill STM32 FX Projects - 簡易サウンドエフェクト・テスト回路 の各エフェクトの簡単な解説です。  ディレイ  最大遅延時間400ms。周波数特性10kHz。Blue Pill(STM32F103C8)のSRAMが20kバイトしかないので、普通に作ればこうなると思います。  アナログディレイ  最大遅延時間800ms。周波数特性1.5kHz。サブサンリングで周波数特性を落とすことで遅延時間を延ばしています。LPFにピークを付けてあるのでフィードバックを最大にすると発振します。  ディレイ(ADPCM)  最大遅延時間1590ms。周波数特性10kHz。ADPCMによるデータ圧縮を使ったディレイです。ADPCMは16ビットデータを4ビットデータへ圧縮します。最大遅延時間が4倍に伸びますが音声品質が少し悪くなります。  2タップディレイ(ADPCM)  サウンドオンサウンド用の特殊なディレイです。ピンポンディレイのモノラル版だと考えて貰うと分かり易いです。遅延を最大にしてフィードバックをゼロにするとディレイ音が2回返ってくるのが分かると思います。ADPCMを使っているので音質は少し落ちますが、最大遅延時間は1590ms(790ms x2)です。  モジュレーションディレイ  最大遅延時間800ms。周波数特性5kHz。ディレイというよりコーラス/フランジャーのロングディレイ版という方が近いのかもしれません。サブサンリングで周波数特性を落とすことで遅延時間を延ばしています。  コーラス   フランジャー   フェイザー  musicdsp.orgのphaser.cを元にしたフェイザーです。RateとDepthの外にフィードバックとフィルタの段数切り替えができます。  トレモロ  普通のトレモロです。少し違いが分かり難いのですが、モード1が正弦波、モード2が矩形波です。  リングモジュレーター   リバーブ  freeverbを元にしたリバーブで、シュレーダーのリバーブレーターの実装です。コムフィルター8個、オールパスフィルター4個で構成されています。サブサンリングで周波数特性を落とすことで遅延時間を延ばしているので周波数特性は10kHzです。  エフェ

Blue Pill FX Projects~プログラムコントローラー~

前回製作したBlue Pillディレイと接続して、5個までのエフェクトクトパラメーターを記憶、呼び出しできるプログラムコントローラーを作りました。  機能  ・5プログラムチェンジ(2~5可変) ・タップテンポ設定(オマケ) 今回はBlue Pillマイコンボードとスイッチ、LED+α程度の簡単な回路です。小型の1590Aのケースに作り込むのがちょっとしんどいかもしれませんが、近年の高密度自作エフェクターに比べればまだ楽な方だと思います。  パーツレイアウト  Blue Pill ディレイと同じようにピンソケットで基板とBlue Pillを接続する2枚重ね構造です。 片面基板で作りました。LEDとタクトスイッチはパターン面にハンダ付けします。 秋月にあった基板用ネジ端子をPCB-54L(左用)とPCB-54R(右用)を使ってケースに固定しました。 基板用ネジ端子とぶつかるのでピンヘッダは片側20ピン、もう片側が16ピンにしてハンダ付けします。ピンソケットも20ピン用と16ピン用を用意します。 タクトスイッチはシャフトの少し長め(6mm)のものを使います。フットスイッチはモーメンタリー(押している時だけオン)タイプです。 テスト段階ではUSBシリアルモジュールを使って通信していたのですが、通信の度に凄いノイズが出て、とてもE.ギターアンプに繋げられるようなものではありませんでした。「これは失敗かな?」と思っていたのですが、Blue Pill同士の通信はとても静かで、通信ノイズはほとんど聞こえません。  回路図   LED抵抗の調節  LED抵抗(R1~5は)とりあえず2.2kとしましたが、これは全て赤色のLEDを使用した時の抵抗値です。使用するLEDによって輝度が変わるので、抵抗値は各自で調節してください。1個づつ色違いにするなら同じ抵抗値では輝度は揃いません。ハンダ付けの前にブレボなどで1個づつLED抵抗値を調節します。 使用したLEDは中国サイトから購入したものですが、赤色LEDは2.2kでも輝度は十分でしたが、緑色は220Ωまで下げないと赤色と同じくらいの輝度にはなりませんでした。お陰で全灯時はLEDだけで電流が10mAにな

Blue Pill FX Projects~デジタルディレイ~

■$2の格安マイコンボードBlue Pill STM32を使って、E.ギター用のデジタルディレイを作りました。 モノラル-シングルエフェクトです。ノーマルディレイ、アナログディレイ、リバースディレイのどれか1つをトグルスイッチで切り替えられます。 ・最長ディレイタイム        ・ノーマルモード : 425ms (周波数特性:7kHz)       ・アナログモード : 800ms (周波数特性:1.5kHz)       ・リバースモード : 420ms (周波数特性:7kHz) ・消費電力 DC9V 55mA 音は普通のディレイです。ノーマルモードの周波数特性が7kHz(-6db)なのでBBDやPT2399よりはクリアな音です。S/NはPT2399ディレイと同じくらいです。 このデジタルエフェクターに使用した小型のマイコンボードです。海外のホビーマイコンユーザーの間でBlue Pill(青い錠剤)と呼ばれているものです。大きさ23mm x 55mmの基板でエフェクターケース(1590B/TD6-11-3)に余裕で入ります。Aliexpressなら$2(+送料)で手に入ります。日本国内ではAmazonやaitendoで取り扱いがあります。米国ではebayで見つかります。"STM32F103C8T6"で検索します。  マイコンボード のスペック   ■STMicroelectronics製STM32F103C8T6(Cortex-M3 32ビットARMマイコン) ■動作クロック 72MHz ■プログラムFlash 64k ■SRAM 20k ■ADC 12ビット 2系統 ■DACなし このMCUにはDACが内蔵されていません。そこでDual PWM DACという方法でアナログ信号を出力しています。疑似DACといったところでしょうか。2本の抵抗と1個のコンデンサでデジタル信号をアナログ信号へ変換する面白い回路です。 あと、このマイコンボードの他にプログラムを書き込む為のプログラムライターが必要になりますが、詳しくは別の記事で書いているので参照してください。プログラムライターもAliexpressでなら$2程度で入手できます。

メディアンフィルタ

Blue Pill STM32のADCで可変抵抗の電圧値を得るプログラムを作ってみました。得られたデータをパソコンでプロットしてみると(Arduinoのシリアルプロッタが便利です)、かなりノイズが乗っていることが分かりました。たとえばこの電圧値でディレイエフェクトのディレイタイムをコントロールするとディレイタイムが小刻みに変動するので変調が掛かったような音になってしまいます。プロットしたデータをよく見ると一定周期で急峻なピーク性のノイズが入っていることが分かりました。なぜそのようなノイズが入ってくるのか?はとりあえず置いといてw、そういったノイズにはメディアンフィルタが効くことは周知です。ネットを検索すると 3×3メディアンフィルタの高速アルゴリズム https://www.ipsj.or.jp/award/9faeag0000004f1r-att/LI_9.pdf というものが見つかりました。アルゴリズムの解説だけでサンプルコードが無いのでCで書いてみました。 サンプルコード https://drive.google.com/open?id=1sgfnKE-feYtykObY0WH8G4p-XPsWaF90 サンプルコードは画像用ではない一般的な9個のデータ用のメディアンフィルタの実装です。アルゴリズムの解説に沿ったプログラムの流れにしたのでアルゴリズムの解説と合わせて見てもらうと分かり易いです。 サンプルコードは9個のバッファにランダムな数値を入れてそれを並べ変えて中央値が取れていることを確認するだけの単純なものです。 クイックソートと比べて約2.5倍くらい速くなりました。これでスパイク性のノイズはきれいに取れましたが全てのノイズが消えることはありません。メディアンフィルタが速くなった分、さらに平均化フィルタも追加したところかなり安定したデータになりました。ノイズは3/4096くらいまで抑えられました。0.07%ですからまずまずでしょう。