2016年9月18日日曜日

MSYS2 の設定メモ

個人的な設定のメモ。
もう何年も本家MinGWを使ってきたのだが、64ビットのバイナリを出力するためにMSYS2を導入した。

1. 導入

msys2.github.io から最新版のインストーラ(執筆時点では msys2-x86_64-20160205.exe )をダウンロードする。
インストーラはウィザード形式。
デフォルトでは C:\msys64\ 以下にMSYS2一式がインストールされる。

msys2-shell.bat を開く
(古いバージョンではシェルの初回起動時に各種設定をしていたようだが、新しいインストーラは自動でやってくれるっぽい。)

パッケージマネージャ pacman を更新する
最新版を導入した直後であれば行う必要はない。
pacman -Sy pacman
このコマンドの実行が終わったら、更新を反映させるために一旦MSYS2を閉じて、また起動する。

インストール済みのパッケージを更新する
こちらは最新版をインストールした直後でも、あとからアップデートされていることがあるのでやっておく。
pacman -Syu
これでひととおり最新の状態になった。

2. mintty の設定をいじる

本家 MinGW とは異なり、MSYS2 は mintty というターミナルエミュレータ上で動いている。
コマンドプロンプトと比べて細かなカスタマイズができるので、いろいろ触ってみるとおもしろい。

デフォルトのフォントは Consolas に設定されている。
当初は Inconsolata に日本語表示用の MeiryoKe をフォントリンクしたものを使っていた(参考:Windowsで最高のターミナルを構築する方法)。
しかし、個人的には統一感がないように見えてあまり気に入らなかったので、最近はVLゴシックに設定している。

mintty のウィンドウを右クリックして Options... を開くと、設定ウィンドウが出てくる。
フォントは Text タブで変更できる。
また、Looks タブ → Transparency=Low に設定している(ちょっと背景が透けてカッチョよくなる)。

3. 開発系パッケージを追加する

MSYS2 の初期状態は、必要最低限のシステムしか用意されていない。
そのため make や gcc といったツール類は、必要に応じて pacman で追加する。

ここで注意したいのは、 MSYS2 には MSYS2, MinGW32, MinGW64 という別々の環境が用意されていること。
32bitのバイナリを作るときは「MinGW32」、64bitなら「MinGW64」といった使い分けをする。

実際にはこんな感じになる(MSYS2を試してみる を参考にした)。
pacman -S base-devel msys2-devel mingw-w64-i686-toolchain mingw-w64-x86_64-toolchain
MinGW-w64 をインストールしたフォルダにある mingw32.exe を起動すると32bit版、mingw64.exe を起動すると64bit版に切り替わる。

ちなみに、MSYS2用gccで生成したバイナリは msys-2.0.dll に依存する。
実行ファイルを配布することを考えなければ、多少サイズを軽減できるMSYS2版を使うとよいかもしれない

参考リンク

msys2.github.io
Windowsで最高のターミナルを構築する方法
MSYS2を試してみる

2016年3月19日土曜日

PortAudio を VS2010 Express でビルドする

PortAudio を Visual C++ から利用しようと思ったのだが、導入に手こずってはまりかけた。
環境: Windows 8.1 (x64), Visual Studio 2010 Express, CMake 3.2.2

使ったソースは pa_stable_v19_20140130.tgz。
このなかにある build/msvc 以下のファイルは、VS2010で開くとプロジェクト変換に失敗してしまう。
検索してみると VS2008 ならうまくプロジェクト変換できるという情報(PortAudioでリアルタイム入出力制御 (1))もあったが、今回のPortAudioのためだけに環境を構築しなおすのはあまりにも面倒くさすぎるので試さなかった。

最終的には、CMake を使ってVisualStudioプロジェクトを生成したところ、うまくビルドできた。
詳しいことはPortAudioのCMakeに関するドキュメント(Creating MSVC Build Files via CMake)に書いてある。

以下にざっくりと手順を書いておく。
  1. CMake 2.8以降をインストールする。
  2. PortAudio から ASIO を利用したい場合は ASIOSDK をダウンロード。フォルダ名を「ASIOSDK2.3」から「ASIOSDK」にして src/hostapi/asio にコピーする。
  3. CMake GUI を起動。「Where is the source code」には CMakeLists.txt があるディレクトリ、「Where to build the binaries」にはVS2010プロジェクトを作るディレクトリを指定する。
  4. 「Configure」をクリック。ドロップボックスからVisualC++のバージョンを選ぶ。
  5. 必要に応じて PA_USE_ASIO などのオプションをいじる(オプションを変更する場合、再度Configureする必要がある)。
  6. 「Generate」をクリック。指定ディレクトリにVC++プロジェクトが生成される。

いままでほとんどCMakeを使ってこなかったけれど、思った以上に便利で感動した。

2015年1月1日木曜日

謹賀新年

あけましておめでとうございます
しばらく更新が途絶えてしまいましたが生きております!
気づけばMOGESYSTEM HPも5年目。早いものだなあ。
本年もよろしくお願いいたします。

2013年11月2日土曜日

基本波形の生成

オーディオ関連のプログラムを作っていると、sin波、ノコギリ波、ノイズなどの波形を生成したい場面が多い。
そんなわけで、今回はいろんな波形を簡単に生成する方法のメモ。

サンプルコードはC/C++っぽい表記で書く。
おかしなところなどあればコメント欄までお願いします。


1. ノコギリ波
ノコギリ波は、1周期中に振幅が直線的に 0.0 から 1.0 まで増えていく波形。

これを実装するには、1サンプルごとに (周波数/サンプリング周波数) を足しあわせていく。
ただ足しているだけだと 1.0 を超えてしまうので、また 0.0 に戻してスタートさせるようにする。「1.0 を超えたら 0.0 に戻す」は「小数点以下を取り出す」と同じ操作になる。
小数点以下を取り出すには、元の値から整数部分を引き算すればよい。

実際に書いてみるとこんな感じ。
この関数を何度か呼び出して戻り値の折れ線グラフを描くと、ノコギリ波になっていることを確認できる。
また、下のプログラムでは値を -1 ~ 1 の範囲で返すようにしてある。

2013年3月19日火曜日

アセンブラでWin32APIを使ってみる(MessageBox編)

RubyやPython、JavaScriptのような高級なプログラミング言語が浸透してだいぶ経ちました。
たくさんの便利なライブラリが整っていますし、少ないコード量で面倒な処理ができるところが魅力的です。
とはいえ、こういった言語ばかり触っていると低水準な言語でゴリゴリと書きたくなってきませんか?ほら、なってきましたね。

そんなわけで、もっとも低水準なプログラミング環境といえるであろうアセンブラでWin32APIを使ったアプリケーションを作ります。
今回使うツールは以下の通り。

ちなみに最初はMASMを使おうと思ったのですが、Microsoft純正だけありWin32APIのサポートがしっかりされていてつまらないので、今回はNASMを使って縛りプレイをしてみます。

ALINKは。
上記のALINKのサイトの
「Download my Win32 Import library(win32.lib)」
からALINK用のWin32APIライブラリをダウンロードしておきます。
NASM、ALINK、win32.libは同じフォルダに入れてソースコードと同じフォルダに置きます。



まずはお決まりのHello worldを作ってみます。
ウィンドウ表示をすると複雑になるので、MessageBox関数で表示させることにします。
以下のようなプログラムを test.asm などのファイル名で保存します。

bits 32
extern MessageBoxA
extern ExitProcess

section .text
global winmain

winmain:
    push dword 0
    push dword title
    push dword string
    push dword 0
    call MessageBoxA

    push dword 0
    call ExitProcess
    ret

section .data
    title: db 'Test', 0
    string: db 'Hello world!', 0

プログラム中で呼び出しているAPIは、あらかじめ extern ~ で関数名を指定しておく必要があります。
(たまに win32.lib に定義が含まれていないAPI関数もあるので注意。)
アセンブラからAPIを呼び出すにはcall命令を使います。
関数の引数はpush命令でスタックに積みます。面倒ですね。

また、C/C++の場合は windows.h で関数形式マクロとして「MessageBox」が用意されていましたが、アセンブリ言語で呼び出す場合は使えません。
(「MessageBox」は Shift-JIS版API の「MessageBoxA」と Unicode版API の「MessageBoxW」を、プログラム上の文字コード設定に合わせて切り替えるマクロです。)
アセンブリ言語から呼び出す場合は「MessageBoxA」のように直接関数名を指定する必要があります。

プログラムの最後には必ず ExitProcess 関数を呼び出します
これを呼び出し忘れると、メッセージボックスを閉じてもプロセスが終了しません。
作ったプログラムがタスクマネージャ上に残りつづける事態になるので注意しましょう。


このソースコードから実行ファイル (.exe) を生成してみましょう。

NASM で test.obj を生成
nasm.exe test.asm -fwin32

ALINK で test.obj と win32.lib をリンクしてexeファイルを生成
alink.exe test.obj win32.lib -oPE -entry winmain


アセンブリ言語を書いているとコンパイラの恩恵を感じますね。
もし次回があれば、ウィンドウ表示をしてみるつもりです。