C++でADX2LE

2014-01-18新規作成。2014-12-27更新。

目次


このページは?

C++を使ってADX2LEを初めて触る人向けのページです。
サウンドプログラムをやってみたい方向けです。
目標は、Hello Worldのようにシンプルです。具体的には音楽の基本「ドレミ」を鳴らす「Doremi」というオリジナルアプリを作りながら、初歩のプログラムを学びます。

〜全体の流れ〜

1.文字を表示するだけのアプリ
2.ADX2LEのサンプルを動かす
3.サウンドデータを作成する
4.ドレミを鳴らす
おまけ.MMLを鳴らす


まずはダウンロード

C++の開発にはVisualStudioを使います。VisualStudioは、ここでは無料の開発ツールの「Visual Studio Express 2013 for Windows Desktop」を使います。
それとミドルウェアとしてADX2LEを使いますのでこれもダウンロード。リンク先のダウンロードから青い方の「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;
}
これで実行すると、エラーが消えているはず。

一時停止させる

で、あっというまに実行が終わってしまうので、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というフォルダができます。これをプロジェクトの近くへコピーしてください。

CRIのマニュアルを見る

  • cri/documentation/CRI_ADX2LE_PC_Manual_j.chmを開く
のですが、内容が表示されないので、一度閉じて、
  • cri/documentation/CRI_ADX2LE_PC_Manual_j.chmを右クリックでメニューから「プロパティ」を選択し、「ブロックの解除」ボタンを押し、「OK」を押します。
再度開くと内容が表示されるはず。

Webからもマニュアル見れます→ADX2LEマニュアル

サンプルを動かす

cri\pc\samples\criatom\programs\Basic\pcvcにBasic.slnというソリューション(visualstudioのプロジェクトをまとめたランチャーみたいなもの)があるのでこれを開きます。

[トラブルシュート]実行するとエラーがでますその1

エラー	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 プロパティ ページ」を開き、「構成プロパティ>ビルドイベント>ビルド後イベント」を選択します。
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)"
と修正しましょう。

2014-12-27追記:

[トラブルシュート]実行するとエラーがでますその2

これも自分の環境ではパスがずれていてヘッダーが認識できていない様子なので、パスを確認します。
環境依存しないように相対パスで指定しておくのが良いのですが、うまくいかなかったのでここでは直接パスで指定しています。

ライブラリのインクルードもずれているので修正。

サンプルを実行

カーソルで[*]を上下に動かして、[1]キーで再生すると音が鳴ったらOK。いろんな音がでますね。




データを準備する

  • cri\tools\criatomex\CriAtomCraft.exeを起動

素材ダウンロード

  • デモプロジェクトのダウンロードボタンを押すとダウンロードサイトが開く
  • CRI Atom Craft向けフリー波形素材集(チップチューン風)をダウンロード
  • ダウンロードしたchiptune20130115.zipを右クリックで「すべて展開」を選択し解凍

プロジェクト作成

  • ファイルメニューからプロジェクトの新規作成を選択し、プロジェクト名を「Doremi」に変更し、
  • プロジェクトルートパスの最後の部分を「Doremi」に変更する。
  • 「新規プロジェクト」ボタンを押す。

波形の追加

acbビルド

acb出力先を表示


ADX2圧縮設定の用途別おすすめ

ADX2では設定を変更する事で、圧縮時の音質改善が可能です。音が悪いと感じたら設定を弄りましょう。
また、サイズが大きすぎる場合などにも設定を変更します。

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

詳しくはこちらを動かしてみてください。
実際の動作の動画はこちら


プログラムについて

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をコピーする。

すべてうまく行くと実行できる。

完成品

以下からDoremi.zipをダウンロードして解凍してください
Doremi.zip