C++でADX2LE

「C++でADX2LE」の編集履歴(バックアップ)一覧に戻る

C++でADX2LE - (2014/01/21 (火) 21:19:53) のソース

2014-01-18更新。

*目次
#contents()

*このページは?
C++を使ってADX2LEを初めて触る人向けのページです。
サウンドプログラムをやってみたい方向けです。
目標は、Hello Worldのようにシンプルです。具体的には音楽の基本「ドレミ」を鳴らす。
*まずはダウンロード
#ref(download.png)
C++の開発には[[VisualStudio>http://www.microsoft.com/ja-jp/dev/]]を使います。VisualStudioは、ここでは無料の開発ツールの「Visual Studio Express 2013 for Windows Desktop」を使います。
それとミドルウェアとして[[ADX2LE>http://www.adx2le.com/]]を使いますのでこれもダウンロード。リンク先のダウンロードから青い方の「Windows版」をダウンロードします。

*環境
始める前に自分の開発する環境の説明。
VisualStudioが動く環境で、音が出るならとりあえずなんでも大丈夫だと思います。
ちなみに自分は、MacのParallels上で、Windows7(64bit)環境を使用しています。マシンはMacBookAir(13-inch, Mid 2012)です。

**VisualStudioを起動しプロジェクトを作成する
VisualStudioを起動します。
- プロジェクトの作成
ファイルメニューから「新しいプロジェクト」を選択。
テンプレート>Visual C++>Win32を選択し、Win32 コンソール アプリケーション VC++がハイライトされた状態にします。
名前の項目にアプリケーションの名前を入れます。ここでは「Doremi」とでもします。
右下の「ソリューションディレクトリを作成」は使わないのでチェックボックスを外しておきます。
「OK」ボタンを押すと、「Win32 アプリケーション ウィザード」が開きます。
- Win32 アプリケーション ウィザードでの設定
「次へ」を押して、追加のオプションの「プリコンパイル済みヘッダー」のチェックを外します。
「完了」を押す。
**Doremiを実行する
真ん中上の方に再生ボタンがあるので押すと、一瞬黒いwindowがでて閉じたと思います。
***Doremiを改良する
シンプルなアプリができましたので、少しコードを弄って、すぐに閉じない用にします。
Doremi.cppを以下のように書き換えてください。
 #include "stdafx.h"
 int _tmain(int argc, _TCHAR* argv[])
 {
 	cout << "Hello ADX2LE";
 	return 0;
 }
と、実行すると以下のエラーが出ると思います。
 エラー	1	error C2065: 'cout' : 定義されていない識別子です。	
これは、プログラムが「cout」という文字のコマンドを理解できていない為におこるエラーで、「cout」を定義する必要があります。
定義するには、「#include」を使います。
 #include "stdafx.h"
 #include <iostream>
 using namespace std;
 int _tmain(int argc, _TCHAR* argv[])
 {
 	cout << "Hello ADX2LE";
 	return 0;
 }
これで実行すると、エラーが消えているはず。
#ref(helloAdx2LE.png)

*** 一時停止させる
で、あっというまに実行が終わってしまうので、return 0の左横のところを一回クリックして赤い点がでるようにしておくと、一時停止してくれます。
**文字入力をする
以下のようにコードを書き換える。
 #include "stdafx.h"
 #include <iostream>
 #include <string>
 using namespace std;
 int _tmain(int argc, _TCHAR* argv[])
 {
 	cout << "Hello ADX2LE";
 	string input;
 	cin >> input;
 	cout << input;
 	return 0;
 }
実行すると、「Hello ADX2LE」のすぐ横で入力待ちになっているので、適当に文字「cde」と入力し、returnキーで確定すると一瞬文字が出て終了します。
これで、変数input(型string)に入力した文字が入って、それが最後に出力されます。
入力した文字で音を鳴らすようにこれを改造していきます。
*ADX2LEの準備
ADX2LEのダウンロードしたzipを解凍します。
- cri_adx2le_sdk_pc_v110.zipを右クリックで「すべて展開」を選択
すると、criというフォルダができます。これをプロジェクトの近くへコピーしてください。
#ref(copy_cri_folder.png)
**CRIのマニュアルを見る
- cri/documentation/CRI_ADX2LE_PC_Manual_j.chmを開く
のですが、内容が表示されないので、一度閉じて、
- cri/documentation/CRI_ADX2LE_PC_Manual_j.chmを右クリックでメニューから「プロパティ」を選択し、「ブロックの解除」ボタンを押し、「OK」を押します。
再度開くと内容が表示されるはず。

Webからもマニュアル見れます→[[ADX2LEマニュアル>http://www.criware.jp/adx2le/docs/windows/index_man.html]]

**サンプルを動かす
cri\pc\samples\criatom\programs\Basic\pcvcにBasic.slnというソリューション(visualstudioのプロジェクトをまとめたランチャーみたいなもの)があるのでこれを開きます。
- 実行するとエラーがでます。
 エラー	1	error MSB3073: コマンド "xcopy /D /Y ..\..\..\..\..\libs\x86\cri_ware_pcx86_LE.dll C:\Users\hogehoge\Documents\Visual Studio 2013\Projects\cri\pc\samples\criatom\programs\Basic\pcvc\Debug\
 :VCEnd" はコード 4 で終了しました。	C:\Program Files (x86)\MSBuild\Microsoft.Cpp\v4.0\V120\Microsoft.CppCommon.targets	132	5	Basic
何やらxcopyコマンドでコピーをしようとしてエラーになるようです。
 コピーしようとしているのはcri_ware_pcx86_LE.dllで、これが無いと音が出ない。
- xcopyを修正する
メニュー「プロジェクト>プロパティ」で「Basic プロパティ ページ」を開き、「構成プロパティ>ビルドイベント>ビルド後イベント」を選択します。
#ref(ビルド後イベント修正.png)
 C:\Users\hogehoge\Documents\Visual Studio 2013\Projects\cri\pc\libs\x86\cri_ware_pcx86_LE.dll  <- 目的のライブラリのある場所
 C:\Users\hogehoge\Documents\Visual Studio 2013\Projects\cri\pc\samples\criatom\programs\Basic\pcvc  <- サンプルのある場所
あっているようにみえるのですが、おそらく「Visual Studio 2013」のようにフォルダにスペースが含まれているのでうまく動いていない様子。
ので、
 xcopy /D /Y ..\..\..\..\..\libs\x86\cri_ware_pcx86_LE.dll $(OutDir)
を
 xcopy /D /Y ..\..\..\..\..\libs\x86\cri_ware_pcx86_LE.dll "$(OutDir)"
と修正しましょう。
** サンプルを実行
#ref(CRISample実行.png)
カーソルで[*]を上下に動かして、[1]キーで再生すると音が鳴ったらOK。いろんな音がでますね。
* データを準備する
- cri\tools\criatomex\CriAtomCraft.exeを起動
**素材ダウンロード
- デモプロジェクトのダウンロードボタンを押すと[[ダウンロードサイト>http://www.criware.jp/adx2/demo/download_j.php]]が開く
- CRI Atom Craft向けフリー波形素材集(チップチューン風)をダウンロード
- ダウンロードしたchiptune20130115.zipを右クリックで「すべて展開」を選択し解凍
**プロジェクト作成
- ファイルメニューからプロジェクトの新規作成を選択し、プロジェクト名を「Doremi」に変更し、
- プロジェクトルートパスの最後の部分を「Doremi」に変更する。
- 「新規プロジェクト」ボタンを押す。
#ref(新規Doremi.png)
**波形の追加
#ref(dropwave.png)
**acbビルド
#ref(acbBuild.png)
**acb出力先を表示
#ref(openAcbOutput.png)

**Tips
***A 音を最高に良くする
 ターゲットコンフィグ>Public>エンコーディングタイプ(メモリ)を「HCA」
 ターゲットコンフィグ>Public>エンコーディングタイプ(ストリーム)を「HCA」
 ターゲットコンフィグ>Public>エンコード品質を「最高品質」
***B サイズを最高に小さくする
 ターゲットコンフィグ>Public>エンコーディングタイプ(メモリ)を「HCA」
 ターゲットコンフィグ>Public>エンコーディングタイプ(ストリーム)を「HCA」
 ターゲットコンフィグ>Public>エンコード品質を「最低品質(最高圧縮)」
***C 処理負荷を下げる
 ターゲットコンフィグ>Public>エンコーディングタイプ(メモリ)を「ADX」
 ターゲットコンフィグ>Public>エンコーディングタイプ(ストリーム)を「ADX」
 ターゲットコンフィグ>Public>強制リサンプリング有効フラグを「True」
 ターゲットコンフィグ>Public>強制リサンプリングレートを「32000Hz」(※32000Hz以下にしても音が悪くなるだけなので注意)
発音数が多い場合8~の場合は次のDの設定を検討する。
***D 処理負荷を下げて且つサイズを小さくする
 ターゲットコンフィグ>Public>エンコーディングタイプ(メモリ)を「HCA-MX」
 ターゲットコンフィグ>Public>エンコーディングタイプ(ストリーム)を「HCA-MX」
 ターゲットコンフィグ>Public>エンコード品質を「最低品質(最高圧縮)」
 ターゲットコンフィグ>Public>HCA-MXサンプリングレートを「32000Hz」(※HCA,HCA-MX時はサンプリングレートはなるべく弄らない、下げても音が悪くなるだけなので注意)
発音数が多い場合Cより処理負荷が下がる。1~2音しか鳴らさないならCの方が処理負荷が低い。
注意:Pitch変更は不可になる。サンプリングレートもすべて固定になる。エフェクトもほぼ使用不可。
***E 妥当な設定(PCの場合)
 ターゲットコンフィグ>Public>エンコーディングタイプ(メモリ)を「HCA」
 ターゲットコンフィグ>Public>エンコーディングタイプ(ストリーム)を「HCA」
 ターゲットコンフィグ>Public>エンコード品質を「高品質」

* 応用 ADX2LE で MML
詳しくはこちらを動かしてみてください。
[[実際の動作の動画やソースはこちら>http://tatmos.tumblr.com/post/73786182833/doremi-mml]]

***プログラムについて
Doremi.cppには、上で紹介したプログラムに2行
 SoundManager sm;
 sm.Play(input);
が追加されています。
これが音を鳴らすクラスで、
SoundManager.csに初期化、ファイナライズ、あとMML解析&再生機能があります。

- これを解析してもらってサウンドプログラムの楽しさを共有できたら幸い。もし、動作しないとかあったら教えてください。

***ライブラリ、インクルードパスの設定
ここからは細かい説明(もし自分で新しくプロジェクト作って、困った時にでも見てください)
自作したプロジェクトにADX2LEなどのミドルウェアを使う場合、インクルードパスやライブラリへのパスを通す必要があります。

- ミドルウェアへのリンク設定
- プロジェクトメニューから「Doremi のプロパティ」を選択。
- Doremi プロパティページで、「構成プロパティ>C/C++」を選択。
- 「追加のインクルード ディレクトリ」
 C:\Users\hogehoge\Documents\Visual Studio 2013\Projects\cri\pc\include
 C:\Users\hogehoge\Documents\Visual Studio 2013\Projects\Doremi  <- プロジェクトのある場所
パスを通すと#includeが通ります。(相対パスでもOK)

 #include <cri_adx2le_pc.h>

- ライブラリへのパスも通す
「リンカー>全般」の「追加のライブラリディレクトリ」
「リンカー>入力」に「cri_ware_pcx86_LE_import.lib」を追加

 C:\Users\hogehoge\Documents\Visual Studio 2013\Projects\cri\pc\libs\x86
 
 DEBUGフォルダへcri_ware_pcx86_LE.libをコピーする。
 
 すべてうまく行くと実行できる。