トップ «前の日記(2009/11/19(Thu)) 最新 次の日記(2009/11/30(Mon))»
【ソース+水=麦茶色の何か】

半期 四半期 全カテゴリ

今日の一言


2009/11/20(Fri) 多謝って今まで中国語だと思ってた・・・ [長年日記] 2:30現在 11℃

_ [Ubuntu][Linux][Tex][プロジェクト実習][研究関係]Ubuntuにtex環境を入れる

*基本的にはこちら(http://d.hatena.ne.jp/hayamiz/20081111/1226403768)を参考にした。

Ubuntuだとapt-get等が使えるので、比較的簡単にインストールできる。

 $ sudo apt-get install texlive texlive-latex-extra dvipng latex-xft-fonts okumura-clsfiles xdvik-ja dvipsk-ja latex-cjk-japanese latex-cjk-japanese-wadalab jbibtex-bin mendexk xpdf xpdf-japanese gv gs-cjk-resource cmap-adobe-japan1 cmap-adobe-japan2 cmap-adobe-cns1 cmap-adobe-gb1 cmap-adobe-korea1 nkf

これで必要なソフトは全て入ったはず。

きちんと日本語を含んだtexファイルをコンパイルできることを確認。

バージョンにもよるかもしれないが、文字が汚い場合が多いと思う。

なので、フォントの設定方法もメモっておく。

まず、

 $ sudo jisftconfig add

次いで、/etc/texmf/vfontmap.d/20ptex-jisfonts.map の内容を次の様に書き換える。

### For ptex-jisfonts
/usr/share/fonts/truetype/kochi/kochi-mincho.ttf
        rml-jis         JIS-H
/usr/share/fonts/truetype/kochi/kochi-gothic.ttf
        gbm-jis         JIS-H

から

### For ptex-jisfonts
@Mincho Roman|Mincho@
        rml-jis         JIS-H
@Gothic SansSerif|Gothic@
        gbm-jis         JIS-H

のように変更。で、

 $ sudo update-vfontmap

を実行するとjsarticle でも IPAモナーフォントで表示できるようになる。当然、指定するフォントを変えることで、別のフォントも使える。

*Ubuntuのデフォルトの文字エンコードはUTF-8。

が、texはEUCを想定している為、UTF-8で書いたtexファイルでは文字化けが生じる。

なので、あらかじめEUCで表示するか、nkfで文字コードを変更すること。

_ [Ubuntu][FC][Linux][OpenAL][プロジェクト実習][研究関係]OpenALのインストール

研究で本格的にOpenALを使うことになりそうなので、とりあえずメモを残していくことにする。

基本的にUbuntu9.04でのメモなので、それ以外で使えるかどうかは知らん。

全ての基本となる公式HPはここ。(http://connect.creativelabs.com/openal/default.aspx

ここからソース等を落としてきてインストールするわけだが、Ubuntuの場合は、apt-getが使える。

Ubuntuの場合

 $ sudo apt-get install libopenal-dev

でOpenalを、

 $ sudo apt-get install libalut-dev

でALUTをインストール可能。

もしUbuntuで使うなら、これがおすすめ。

ソースからコンパイル(ほぼ未検証)

ソースからだとちょっと面倒。

OpenALをインストール

HPからDownloadsを開き、まずはopenal-soft-1.10.622をDL。

解凍して中に入り、

 $ cmake CMakeLists.txt

でmakefileを作成し、

 $ make
 # make install

でインストール。

ALUTをインストール

HPからfreealut-1.1.0.tar.gzをDL。

解凍して中に入り、

 $ ./configure
 $ make
 ( $ make check )
 $ make install

でインストール。

多分これでOK。

_ [Ubuntu][FC][Linux][OpenAL][研究関係]シンプルなOpenALプログラム

超単純なOpenAL+ALUTプログラム。

基本的にはALUTの「Example: 'Hello, world' in ALUT」(http://connect.creativelabs.com/openal/Documentation/The%20OpenAL%20Utility%20Toolkit.pdf)をちょこっといじっただけ。

ALUTを使うことで、ファイルの読み込み等がかなりシンプルに!

simple_sound.cpp

#include <cstdlib>
#include <AL/alut.h>
#include <cmath>
using namespace std;
int main (int argc, char **argv)
{
  ALuint buffer, source;
  alutInit (&argc, argv);
  buffer = alutCreateBufferHelloWorld ();//Hello Wordl!
//  buffer = alutCreateBufferFromFile (argv[1]);//再生する音源を指定したい場合
  alGenSources (1, &source);
  alSourcei (source, AL_BUFFER, buffer);
  float sita(0.0);
  ALenum state;
  /*リスナのまわりを音源が回る*/
  for (int i = 0; i < 30; i++)
  {
	sita=sita+M_PI/6.0;
	alSource3f(source,AL_POSITION,cos(sita), sin(sita), 0);
	alSourcePlay(source);
    	alGetSourcei(source, AL_SOURCE_STATE, &state);    

    	while(state == AL_PLAYING)
	{
	    alGetSourcei(source, AL_SOURCE_STATE, &state);
	}
  }
  /*リスナが速度20で音源に近づき、抜き去る*/
  for (int i = 0; i < 15; i++)
  {
	alListener3f(AL_POSITION,0,0,15-2*i);
	alListener3f(AL_VELOCITY,0, 0, 20);	//ドップラー効果を付加
	alSourcePlay(source);
    	alGetSourcei(source, AL_SOURCE_STATE, &state);    

    	while(state == AL_PLAYING)
	{
	    alGetSourcei(source, AL_SOURCE_STATE, &state);
	}
  }
  /*後始末*/
  alDeleteSources(1, &source);
  alDeleteBuffers(1, &buffer);
  alutExit ();
  return EXIT_SUCCESS;
}

<コンパイル>

こんな感じで。

 $ g++ simple_sound.cpp -lalut -lopenal -pthread -o simple_sound

<補足>

buffer = alutCreateBufferHelloWorld ();

buffer = alutCreateBufferFromFile (argv[1]);

に書き換えると、

引数に与えた音ファイルを読み込んで再生する。

対応するフォーマットは、完全にALUTまかせなのでよく分からん(ドキュメントが見つからない・・・)が、とりあえずwavが再生できることは確かめた。

_ [Ubuntu][FC][Linux][OpenAL][研究関係]sin波から音を再生するOpenALプログラム

こちら(http://sugarpot.sakura.ne.jp/yuno/?OpenAL%E3%81%AE%E3%83%86%E3%82%B9%E3%83%88)とこちら(http://island.geocities.jp/v_no11/programing/OpenAL.html)を参考にさせてもらいました。多謝。

sin_wave.cpp

#include<cmath>
#include<AL/alut.h>
using namespace std;
int main(int argc, char** argv)
{
	alutInit(&argc,argv);
	ALuint buffer, source;
	alGenBuffers( 1, &buffer );
	alGenSources( 1, &source );
	/*sin波を作成*/
	const int freq = 10000 , Hz = 440;
	ALshort data[freq/Hz];
	for (int i = 0; i < freq/Hz ; ++i)
	{
		data[i] = 32767 * sin(i * M_PI * 2 * Hz / freq);
	}
	alBufferData( buffer, AL_FORMAT_MONO16, data, freq/Hz*sizeof(ALshort), freq );
	alSourcei( source, AL_BUFFER, buffer );
	alSourcei( source, AL_LOOPING, AL_TRUE );
	alSourcePlay( source );
	/*後片付け*/
	alutSleep (1);
	alDeleteSources(1, &source);
  	alDeleteBuffers(1, &buffer);
  	alutExit ();
	return 0;
} 

<コンパイル>

 $ g++ sin_wave.cpp -lalut -lopenal -pthread -o sin_wave

以下、こちら(http://island.geocities.jp/v_no11/programing/OpenAL.html)からの引用。

keypoint

const int freq = 10000 , Hz = 440;では、サンプリング周波数を10000Hz、音階が440Hz(「ラ」)としています。for文でそのデータを作っています。

以下でバッファに音データを渡します。

alBufferData( buffer, AL_FORMAT_MONO16, data, freq/Hz*sizeof(ALshort), freq );

第2引数のAL_FORMAT_MONO16とはモノラルの16bit-PCM音源であることを示しています。

第4引数は渡すデータの長さをbyte単位で渡します。第4引数はサンプリング周波数です。

ここでは1波長分しか音データを作成していないのでループ再生させるため

alSourcei( source, AL_LOOPING, AL_TRUE );

を呼んで、ループ再生をオンにしています。

comment

32767という数字は符号付16bitの数が、-32768〜32767だからです。

AL_FORMAT_MONO16のほかにもAL_FORMAT_MONO8は8bit-PCM音源を表し、0〜255の値で表します。

AL_FORMAT_STEREO16はステレオの16bit-PCM音源を表します。データは左右左右・・・と交互に並べます。

AL_FORMAT_STEREO8はステレオの8bit-PCM音源を表します。

*気になった点を追加で調べた。

ALshortの型

/usr/include/AL/al.hを確認したところ、

/** signed 16-bit 2's complement integer */
typedef short ALshort;

らしい。

今回のプログラムで波形を整形する際の計算で整数と小数がごちゃ混ぜになっているのがちょっと微妙。

が、試しに正しく小数点以下まで扱うようにして見た場合でもあまり差が感じられなかった。むしろ遅延が生じてブツブツと途切れやすい。

なので、これはこれでいいのかも?

_ [Ubuntu][FC][Linux][OpenAL][プロジェクト実習][研究関係]oggファイルを扱うプログラムをコンパイル

コンパイル時に次のオプションを追加。

 -lvorbisfile -lvorbis -logg

なので、例えばOpenALでOggプレイヤーを作りたい場合には、

$  g++ hogehoge.cpp -lalut -lopenal -lvorbisfile -lvorbis -logg -o hogehoge

とする。

_ [Ubuntu][FC][Linux][OpenAL][プロジェクト実習][研究関係]OpenALでストリーミングを行う方法(1)

とりあえずやり方をメモる。

参考サイト:

http://sites.google.com/site/117florian/gijutsu-bunsho/openal

http://sugarpot.sakura.ne.jp/yuno/?OpenAL%E3%82%B9%E3%83%88%E3%83%AA%E3%83%BC%E3%83%9F%E3%83%B3%E3%82%B0%E5%86%8D%E7%94%9F

<基本的な流れ>

   1. Bufferを作成(Nameを取得)
   2. Bufferに波形を登録(Bufferは複数のSourceで共有可能)
   3. Sourceを作成(Nameを取得)
   4. SourceにBufferを登録
   5. Sourceをplay 

定期的にポーリングして、2つめが再生が始まった時点で次の一つを登録することでストリーム再生が出来る。

<もう少し詳しく>

基本的には、バッファを2個以上作ってキューとデキューで実現する。

alSourceQueueBuffers(source, 1, &buffer);

で source に buffer をキュー。、

alGetSourcei(source, AL_BUFFERS_PROCESSED, &n)

で処理済みのバッファ数を取得。

alSourceUnqueueBuffers(source, 1, &buffer);

でバッファ取り出し。

*どうもキューを使うと属性が変えられないっぽい。もう少し調べる。

_ [tDiary][Ubuntu][Linux][FC]tDiary導入時のメモ

本日記はtDiary(http://www.tdiary.org/)というツールを使って作成している。

元々先輩が使っていたのを見て使い始めたのだが、これが意外と使いやすい。

導入方法自体はHPからDLしたソフトを解凍すれば詳細を書いたドキュメントが入っているので、それに従えばいい。

なので、ここでは自分が導入時に、ちょっとだけ手間取った部分をメモる。(versionは2.2.2)

権限の問題

日記のデータを置く場所の権限は755ではダメっぽい。777にしたらいけた。が、かなり危険なので、なんらかの策を講じること。

.htpasswdの作り方

基本的にはhtpasswdコマンドやhtpasswd2コマンドを使って作成する。

<例>

 $ htpasswd2 -c .htpasswd akihiro-i
 パスワードを入力
 パスワードを再度入力

.htpasswd に記載される情報は、アカウント名と暗号化されたパスワード。

アカウント名とパスワードは「:(コロン)」で区切られる。

複数のアカウントを指定する場合は、改行をして次の行に記述される。

日記ページの更新

日記ページの更新はWeb上から出来る。

なおこの場合のユーザ名とパスワードはhtpasswdで決めたもの。

_ [FC][Ubuntu][Linux][OpenGL][プロジェクト実習][研究関係]OpenGLのインストール

 $ sudo apt-get install freeglut3-dev freeglut3-dbg libxmu-dev libxi-dev build-essential

これでOK。

_ [FC][Ubuntu][Linux][OpenCV][プロジェクト実習][研究関係]OpenCVのインストール

$ sudo apt-get install libcv-dev
$ sudo apt-get install libcv1
$ sudo apt-get install libcvaux-dev
$ sudo apt-get install libcvaux1
$ sudo apt-get install libhighgui-dev
$ sudo apt-get install libhighgui1
$ sudo apt-get install opencv-doc

これでOK。(IEEE1394を使いたい場合は以前の記事を参照のこと)