« August 2006 | Main | October 2006 »

2006.09.28

デジタルガジェット音比べ 周波数特性計測(999円プレイヤーDN-2000/Zaurus SL-C3200/SigmarionIII/iPod等)

EDIROLのFA-66というIEEE1394オーディオインターフェイスとWaveSpectraを使って、手持ちのデジタルガジェットの周波数特性を計測してみた。

オーディオソースは、WaveGeneで生成した20Hz~20kHzのサイン波のスイープ信号をLAME3.96.1でデフォルトエンコードしたもの。LPFがかかっているので、16kHz以上はスパっと落ちている。

大体-40dbぐらいになるように入力しているが、これが正しい計測方法なのかは分からない。
サンプリングはASIOドライバ経由、24bit/48kHzで行なっている。

スイープ信号なので、ピークホールドの軌跡である赤い線を参照のこと。
この軌跡が水平一直線に近いほど、素直な特性ということがいえるだろう。

また、1kHz付近を通過する辺りで画像をキャプチャしている。
綺麗な山形が一つだけある形が理想的な状態。
それより低域、高域に余計な山がある場合、それはノイズであり、よろしくない。

自分は全く音響に(も)詳しくないけれども、WaveSpeatraが示す周波数特性のグラフは、聴感上の印象と一致していると感じる。

上海問屋 DN-2000

寸評:ひどい。ただ高域が出ていないだけかと思いきや、特性が不自然にギザギザだし、波形もキタナイ。改造する気失せた。するけど。高域が落ちている通り、聴感上もモコモコとした鈍い音。999円だもんね。
akitenさんの情報によると、エンファシスがかかっている状態の音だそうな。いにしえのFreshMusicでもそうだったなぁ。何でこの手のデバイスはそうなっちゃうんだろうね。

Freqdn2000

改造関係URL

MA8201(Data Sheet)
SA6333(Data Sheet)
上海問屋の激安990円MP3プレーヤーのインプレ・前編
上海問屋の激安990円MP3プレーヤーのインプレ+改造・後編
上海問屋の激安990円MP3プレーヤーのインプレ+改造・おまけ編
All About 'Bivouroku' -徒然@備忘録-

hp iPAQ h2210

寸評:おおむね良好だが、どことなくシャープさに欠ける。定在ノイズは無いが、ピンピンと高調波が散見できる。

Freqh2210

Apple iPod (4G/40GB)

寸評:特にこれといった破綻無し。専用プレイヤーのレゾンデートルを主張といったところか。1Gより音質の向上があったことを確認。

Freqipod4g

hp jornada720

寸評:ひどい。ホワイトノイズもひどい。より高域に突入すると見るに耐えない様になる。デティールに欠ける、遠い音。クロストークもひどく感じる。ありがとうございました。

Freqjornada720

SCE PSP

寸評:優秀な方。でも、16kHz以上の何も音が無いはずの領域を見ると、何か定在ノイズがある? 曲間のノイズ?

Freqpsp

NTT DoCoMo Sigmarion III

寸評:優秀な方。若干高調波が見られる。定在ノイズは無いっぽい。聴感上は悪くない。

Freqsigmarioniii

SHARP Zaurus SL-C3200

寸評:優秀。より高域でも破綻は無く、綺麗な針状のサイン波が移動していく様はほれぼれする。聴感上もいい音だと思う。定在ノイズはSigmarion IIIより多いか。

Freqsl3200

SHARP Zaurus SL-C700

寸評:優秀。SL-C3200とあまり傾向は変わらないが、SL-C3200より少しノイズっぽい? 16kHz以上の領域に見られるノイズは、Media Playerの曲間プチノイズ。

Freqslc700

10kHz対決

1kHz付近の特性を見たが、いいのと悪いのをピックアップして10kHz付近の特性も見てみたい。

上海問屋 DN-2000

寸評:ひどいねー。

Freqdn200010k

hp jornada720

寸評:圧巻。どれが本当の10kHzサイン波なんだか分かんない。お前ら本当にありがとうございました。

Freqjornada72010k

NTT DoCoMo Sigmarion III

寸評:優秀。SL-C3200と甲乙付け難い。

Freqsigmarioniii10k

SHARP Zaurus SL-C3200

寸評:優秀。Sigmarion IIIと甲乙付け難い。

Freqslc320010k

おまけ iPod(1G/5GB)

初代iPodが発掘されたので試してみよう。

1kHz

寸評:音がいまいちはっきりしなかったなあという印象を持っていたけど、やっぱり。

Freqipod1g

10kHz

寸評:10kHz付近はそれほどでもない。この辺りで救われている感じか。

Freqipod1g10k

2006.09.25

車輪格納式インラインスケート「インストレック(Instrek)」インプレッション(2)

インストレック(Instrek)をそれなりに使い込んだので、続報ということで。

前回分エントリ:ウィール格納式インラインスケート「Instrek(インストレック)」インプレッション

動画(movie)

靴下が……とか、スネ毛が……とか、吐息が……とかはこの際いい。
全身でグルーヴを感じるんだ!
(ダウンロードが終わるまで一時停止かけるといいです)

title= "Instrek" type="application/x-shockwave-flash" pluginspage="http://www.macromedia.com/go/getflashplayer"
flashvars="file=http://moyashi.air-nifty.com/instrek.flv&displayheight=300" />

移動手段たりえるか?

個人的に移動手段としての価値に期待して買ったのだが、ヒールブレーキが取り外し式という一点を除いては、これまで存在した同種のものの中では一番の実用度だと断言できる。
また、今後ここまでのユーティリティ性を備えた製品は、少なくとも5年スパンで出てこないだろう。
だから、興味のある人は入手できるうちに買っておいた方がいいよ。

ウィールの出し入れは、慣れると何にも寄りかかること無く、立ったままクイックに行なえる(動画参照)。この点は素晴らしいというほか無い。移動手段としての価値をグっと押し上げるポイントだ。Hypnoの場合、モタモタとウィール部分を装着し、また外している間に、稼いだ時間的なアドバンテージが消失してしまう感があった。

安全性については予断を許さない。ヒールブレーキこそ使っていないが(前回エントリ参照)、今のところ突然ウィールが引っ込んで転んだ、といった目には遭っていない。至ってウィールの固定状態は安定している。
ウィールの出し入れは軽々とできるのに、固定はしっかり。この点は、街乗りだと砂利一つで理不尽な転倒をしてしまいがちな、移動手段としてはリスキーなHeelysに対するアドバンテージといえなくもない。

機能的にはブレーキが問題だ。個人的には、街乗りにおいてヒールブレーキは必要だと思っている。
Hypnoには立派なヒールブレーキが装着可能だ。Heelysはいざとなればつま先全体がブレーキとなる。
インストレックには、頼りなく、不便なヒールブレーキしか無い。
インラインスケートの上級者の多くはヒールブレーキを外しているし、出し入れのたびに付け外しすると機動性が損なわれる。取り外し式なのは構造上しょうがない。ならば、使わないまで。
Tストップ、パワースライドのテクニックを習得すればいい。テクニックで補いさえできれば、インストレックは移動手段として完全になる。

自分はTストップすら怪しいというありさまだったので、インストレックを実用するために特訓した。特訓の結果できるようになった。ヒールブレーキが無いと思うと、できるようになるもんだね。とりあえず土日乗り回した間はヒールブレーキは付けなかった。

テクニックを磨けば、恐らくヒールブレーキが必要と思うことは無くなるのだろう。
しかし、テクニックでブレーキをかけるとウィールが激しく減る。30分ぐらいパワースライドを練習していたら、ブレーキをかける方の一番後ろのウィールが三角になったよ。Tストップはパワースライドほどではないが、やはり1日で目に見えて減る。
だから、長距離乗ることが分かっているシチュエーションでは、ヒールブレーキを使った方がお財布にやさしいかもしれない。

インストレックは移動手段たりえるが、ブレーキングについては考えることが多いだろう。

インストレックのウィークポイント

インストレックは、ウィール径が48mm(22cm〜24cm)/50mm(25cm〜27cm)と小さい。また、3輪しか無い。
だから、走破性やスピードの乗りが通常のインラインスケートより劣るのは分かりきったことだ。
でもどの程度のものか、と思うだろう。

スピードの乗りについては、絶望するほどのものではない。20km、30kmのロングランをしろと言われたら考えてしまうが、少々遅いぐらいだ。

一方で、走破性は街乗りが正直キツいレベルだ。
ちょっと目の荒いアスファルトでも差が出てくる。編み目状の側溝蓋に乗ると転倒の危険がある。
荒れたアスファルトでも、転びかかる。
通常のインラインスケートだと、アスファルト、コンクリートかそうでないかぐらいの気の使い方で走っていけるが、インストレックの場合は路面の状況を詳しく見て、走行ラインを随時吟味する必要がある感じだ。
下りでは、白線の上を走ることが多くなるんじゃないかな(笑)。

インストレックのフレームはガラス繊維+ナイロン製だ。アルミ製のフレームを使ったインラインスケートよりどれぐらい劣るか?
これは意外にも、コントロール性が致命的にスポイルされているような感じは受けなかった。
ただ、ガラス繊維+ナイロン製のフレームがビビって、走行音がうるさい。通常のインラインスケートなら、ほぼ無音で走れるようなシチュエーションでも、ちょっとガラガラとうるさい。この辺は動画を見てもらうと分かるだろう。

インストレックの意外な美点

インストレックは、とても快適性が高い。もちろん、普通の靴と比較するようなものではないが、通常のインラインスケートは、どこかが当たって痛くなるか、靴擦れになりがちだが、インストレックにおいては、それが全く無かった。きっと1日中走っていても大丈夫だろう。
ベルクロをしっかり締めていればサポートは必要十分にあるから、足元が不安定になるということも特別無い。

足首のサポートがあるせいで、通常歩行においてはゴミ箱を足にはめて歩いているかのような歩きにくさがあるわけだが。

メンテナンス

Tストップ、パワースライドが必須、と思っているインストレックだが、そこで気になるのが特殊なサイズであるウィールの入手性。
自分が買ったところに問い合わせてみた。
交換用のウィールを用意しているそうだ。
それも、そんなに高くはなかった。普通のインラインスケートの半額ぐらい。
買うときは、交換用のウィールを用意してくれるか聞いた方がいいだろう。

ちなみに、インストレックのウィールの硬度は標準的な85A。
フレームがガラス繊維+ナイロンなので、路面が悪いところではうるさいが。

ヒールブレーキの交換用はそこには置いてなかったが、DIYショップで入手できるゴムを加工して取り付けている人が居るそうだ。
実際にやっている方がいらしたら教えてほしい。

インストレックが初めてのインラインスケートなら

インストレックの噂を聞いて、手を出そうと思っている人へ。

もしインラインスケートが初めてなら、相当苦労すると思った方がいい。
微動だにできない現実に直面して、こんなはずじゃなかった、と絶望するだろう。
足を地面から上げることができない。前にも後ろにも進めない。そこからのスタートになるはずだ。

ヒーリーズには乗ったことがあるだろうか?
インストレックは、ヒーリーズ(HEELYS)と横並びにしてとらえたくなるが、ヒーリーズはいざというときにつま先での通常歩行に切り替えられる点がインストレックと違う。滑走状態が例外なのだ。
いつでも普段の自分に戻ることができる。そういう甘えが許される。
インストレックの場合、ひとたびウィールを出して走り出したら、ウィールから逃れることはできない。
このことの恐怖というものを一度考えてみるといい。
この恐怖は、ヒーリーズには全く無いものだ。

その壁を乗り越えることができればインストレックは掛け値無しで素晴らしいものだが、必ず壁は越えなくてはならない。そのことを覚えておいてほしい。

インストレックを履いて移動すると楽か?
残念ながら楽じゃない。
長いストロークでずっと走っているようなもので、汗びっしょりになる。
これはスポーツだ。

2006.09.21

JavaScriptで都道府県コード順ソート

ざっとググってみたら、JavaScriptの都道府県コード順ソートのソースが見当たらないみたいなので掲載します。
以前の記事と似ていますが、InDesignは関係ありません。

SrtingオブジェクトとArrayオブジェクトに都道府県コード順ソートのメソッドを追加します。

並びはJIS X 0401による都道府県コードに準拠しています。

都道府県以下は文字コード順ソートです。

使用例

"沖縄県い\r\n東京う\r\nインドい\r\n沖縄県あ\r\n東京い\r\n沖縄県う\r\n東京あ\r\n北海道う\r\nインドあ".kenSort(0);

myArray.kenSort(1);

引数0が昇順、引数1が降順です。降順っていうのは使わないと思いますが。

ソースコード

String.prototype.kenSort=function(order)
{
// 改行コードの割り出し
var lf = "";
RegExp(/\r\n|\r|\n/g).test(this)
lf = RegExp["$&"];

var tempArr = this.split(/\r\n|\n|\r/);
var sortedArr = tempArr.kenSort(order);
return sortedArr.join(lf);
}

Array.prototype.kenSort=function(order)
{
var kenArray = getKenArray();

// 都道府県順ソート
this.sort(
function(x, y)
{
// 引数が0か無しなら昇順
if(!order){return ken2int(x) - ken2int(y);}
// 引数が0以外なら降順
else{return ken2int(y) - ken2int(x);}
}
)

// 都道府県ごとの文字コード順ソート
var tempArray = new Array();
var tempArray2 = new Array();

for(i = 0; i < this.length; i++) // 配列の要素ごとになめる
{
for(j = 0; j < kenArray.length; j++) // 都道府県の配列でなめる
{
if(RegExp(kenArray[j]).test(this[i])) // 配列の要素が都道府県にマッチしたら
{
for(k = i; RegExp(kenArray[j]).test(this[k]) ; k++) // マッチしなくなるまで配列の次の要素を調べる
{
;
}
tempArray2 = this.slice(i, k).sort(); // 都道府県ごとのまとまりでソート
for(l = 0; l < tempArray2.length; l++) // テンポラリの配列に1要素ずつ追加
{
tempArray.push(tempArray2[l]);
}
i = k; // 配列が進んだ分を反映
}
}
}

return tempArray;
}

function getKenArray()
{
return new Array(
"北海道","青森県?","岩手県?","宮城県?","秋田県?","山形県?","福島県?",
"茨城県?","栃木県?","群馬県?","埼玉県?","千葉県?","東京都?","神奈川県?",
"新潟県?","富山県?","石川県?","福井県?","山梨県?","長野県?","岐阜県?",
"静岡県?","愛知県?","三重県?","滋賀県?","京都府?","大阪府?","兵庫県?",
"奈良県?","和歌山県?","鳥取県?","島根県?","岡山県?","広島県?","山口県?",
"徳島県?","香川県?","愛媛県?","高知県?","福岡県?","佐賀県?","長崎県?",
"熊本県?","大分県?","宮崎県?","鹿児島県?","沖縄県?",".");
}

function ken2int(str)
{
var kenArray = getKenArray();
for(i = 0; i < kenArray.length; i++)
{
var regexp = new RegExp(kenArray[i], "g");
if(str.match(regexp))
{
// 都道府県コード返却。配列の[0]がコード1に対応するので1足す
return i + 1;
}
}
}

2006.09.20

Zaurusで英文音声合成 CMU Flite 1.3 releaseのZaurus向けパッケージ

音声合成ソフトウェア(Speech Synthesizer)である、CMU Flite 1.3 releaseのZaurus向けパッケージを作りました。既存のZaurus向けバイナリは1.2しか無いと思います。

ダウンロード flite_1.3-1_arm.ipk.bin (4130.5K)

パッケージにはコマンド「flite」と時刻読み上げ「flite_time」が含まれます。
読み上げは英語のみです。

サンプル

「zaurus.mp3」をダウンロード

使い方

以前のエントリ「ZaurusでCronInetとMewによるメールの定期巡回」で紹介した通り、使い方は簡単で、

flite -t "test"

というのが基本です。

flite test

flite -f test.txt

echo "test" | flite

flite "test" -o test.wav

などなど。
「flite_time」は、時刻読み上げコマンドです。

flite_time 10:30

といった感じで実行します。
だから、現在時刻を読み上げさせたければ、

flite_time `date +%H:%M`

とすればいいわけです。自分には聞き取れませんが。

コマンドラインヘルプ

flite: a small simple speech synthesizer
version: flite-1.3-release October 2005
CMU Copyright 1999-2005, all rights reserved
usage: flite TEXT/FILE [WAVEFILE]
Converts text in TEXTFILE to a waveform in WAVEFILE
If text contains a space the it is treated as a literal
textstring and spoken, and not as a file name
if WAVEFILE is unspecified or "play" the result is
played on the current systems audio device. If WAVEFILE
is "none" the waveform is discarded (good for benchmarking)
Other options must appear before these options
--version Output flite version number
--help Output usage string
-o WAVEFILE Explicitly set output filename
-f TEXTFILE Explicitly set input filename
-t TEXT Explicitly set input textstring
-p PHONES Explicitly set input textstring and synthesize as phones
--set F=V Set feature (guesses type)
-s F=V Set feature (guesses type)
--seti F=V Set int feature
--setf F=V Set float feature
--sets F=V Set string feature
-b Benchmark mode
-l Loop endlessly
-pw Print words
-ps Print segments
-pr RelName Print relation RelName
-v Verbose mode


2006.09.18

Zaurusで音響生成プログラミング言語Csoundを使う

MITのBarry Vercoe教授によって1985年に書かれた音響生成用言語であるところのCsoundというものがある。
C言語で書かれたポータビリティの高いソフトウェアであり、各種環境で動く。
簡単に言うと、Csoundは、テキストファイル形式で書かれたソースコードを元に音声ファイルを吐き出す、超高機能なソフトウェアシンセサイザーだ。
例えば、こんな風に使う。

csound a.orc a.sco -oout; cat out>/dev/dsp

a.orcはオーケストラファイルといい、楽器を定義するもの。a.scoはスコアファイルといい、楽譜を記述するもの。
いずれもテキストファイルだ。それぞれ、所定の書式がある。
上記のコマンドラインでは、csoundがa.orcとa.scoを元にoutという音声ファイルをcsoundが吐き出し、それを/dev/dspに投げ込んで音を出す、といったことをやっている。

パッケージの入手

もちろん、こんなエントリを書くぐらいだから、Zaurus向けのパッケージが存在する。
elsi (embedded linux sodtware index)からCsoundsをもらってくる。
各種ROM用のパッケージがあるので、各々の環境に合わせたものを。
自分は純正ROMなので、Sharp Rom v1.32用のものをもらってきた。

試用してみる

パッケージをインストールすると、「csound」というコマンドが使えるようになる。
とりあえず、orcファイルとscoファイルを書く。しかし、書式が全然分からないので、先人のソースを拝借。
ググると一番上に出てくるWorld of Csoundさんのソースを使用。

study1.orc
study1.sco

カレントディレクトリに置き、以下のコマンドラインを実行。

csound study1.orc study1.sco -oout; cat out>/dev/dsp

すると、アスキーアートで波形が表示された後、outというファイルに音声ファイルが書き出される。それが/dev/dspに流し込まれて音が出る。

「out.mp3」をダウンロード

「-o」オプションの出力先を「-odevaudio」とすると、ファイルに書き出すこと無くそのまま再生してくれる。
ただ、Zaurusだと途切れ途切れになってしまうかも。

Scrn001

編集用モード

当然、Emacs用のメジャーモードが存在する。

Csound-x for Emacs

参考サイト(というかパクった)

音雑 (onzatsu) 〜everything makes noise〜

解説が分かりやすい。サンプルあり。

Csound-jp

Csound処方箋

Blackfin空挺団

2006.09.17

Mac OS X Tiger上にAVR-GCC環境を構築する@2006

WinAVRもいいけど、Mac OS XにもAVR-GCCの環境を構築してみよう。
現在使っているのはMac OS X Tiger(10.4.7)。
intel Macは持ってないので、PPC Mac上で試している。

スキルが無いくせして新しいもの好き。
だから、可能な限り、最新版で構築したい。ちなみに、

sudo gcc_select 3.3

としてGCC3.3で作業している。

参考サイト

Mac OS X で Atmel AVR マイクロコントローラのプログラムを作る
Programming ATMEL microprocessors on a Mac
AVR Microcontroller Programming on a Mac
Using AVR Microprocessors Under OS/X
Installing AVR Toolchain on MAC OS X

今は、binutilsにしろgccにしろ、本家本元がAVRに対応しているので、昔のように特別な作業をする必要無し。
binutils、gcc、avr-libc、uispの最新版を入手してビルドすればいいだけ。

基本のインストール方法はAVR LibCのマニュアルに書いてある。

http://www.nongnu.org/avr-libc/user-manual/index.html
http://www11.ocn.ne.jp/~akibow/AVR-LibC_1.2.3J/

GNU Binutils、GCC、AVR LibCの順でビルドする。

GNU Binutils(アセンブラ、リンカ等)

http://www.gnu.org/software/binutils/

最新のリリース版をダウンロードしてくる。CVS先端を試してみたけど、現時点のものはうまくビルドできなかった。

tar xvzf binutils-2.17.tar.gz
cd binutils-2.17
mkdir obj-avr
cd obj-avr
../configure --target=avr --program-prefix='avr-' --disable-nls; make; sudo make install

GCC, the GNU Compiler Collection(Cコンパイラ)

http://gcc.gnu.org/

GCC4.2のsnapshotを落としてきた。snapshot版はMPUのサポートがリリース版より厚い。

http://gcc.gnu.org/mirrors.html

上記のミラーから適当なftpサーバを探してダウンロードする。

wget ftp://ftp.iij.ad.jp/pub/gcc/snapshots/LATEST-4.2/gcc-core-4.2-20060916.tar.bz2
tar xvjf gcc-core-4.2-20060916.tar.bz2
cd gcc-4.2-20060916
mkdir obj-avr
cd obj-avr

../configure --target=avr --program-prefix='avr-' --enable-languages=c --with-dwarf2 --disable-nls --disable-libssp; make; sudo make install

--disable-libsspを指定しないとダメなので注意。

AVR LibC(Cランタイムライブラリ)

http://www.nongnu.org/avr-libc/

これは、AVR LibCのマニュアルが勧める通りmkdir obj-avr、cd obj-avrしてからconfigureしようとすると失敗したので、カレントディレクトリでconfigureしている。

CVS先端ですんなりビルドできたので、それを使った。

cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/avr-libc login
cvs -z3 -d:pserver:anonymous@cvs.savannah.nongnu.org:/sources/avr-libc co avr-libc
cd avr-libc
cvs update -dP
./bootstrap
./configure --build=`./config.guess` --host=avr; make; sudo make install

uisp(ユニバーサルインシステムプログラマ)

http://savannah.nongnu.org/projects/uisp/

tar xvzf uisp-20050207.tar.gz
cd uisp-20050207
mkdir obj-avr
cd obj-avr
../configure; make; sudo make install

AVR-GDB

役に立つかどうか分からないので試してない。
AVR LibCのインストールマニュアルに解説あり。

スクラッチから環境を作る際の注意点

上記の手順だけではサポートデバイスが不十分かもしれない。その場合はパッチを当てる必要があるそうだ。

http://www7a.biglobe.ne.jp/~attlee/avr-jp-wiki/wiki.cgi?page=AVR-LibC

USB Serial変換アダプタとuisp関係

手持ちのUSB Serial変換アダプタは、秋月通商のUSB-RS232変換ケーブルとKeyspanのUSA-19HS。
秋月通商のUSB-RS232変換ケーブルの中の人はATEN社のUC-232Aで、Mac OS X用のドライバは以下にあった。

http://www.aten.com.tw/download/download.php?pid=20050824161341006&type=driver#showResult

KeyspanのUSA-19HSは、現在ドライバーがデッドリンクになっていて、どうしたものかと思ったら以下にあった。

http://www.keyspan.com/downloads-files/usa/UniversalBinary/

ドライバをインストールし、接続すると/dev/tty.xxxxにデバイスが現れる。

使っているのは、MorosansoftさんのAVRISP互換ライタ。とても簡単に作れ、AVR Studioで認識するし、USB Serial変換アダプタ経由でも使えるので便利。マイコンをいじるのはほぼ初めてで、ライタを自作したのも初めてなので客観的評価はできないが、とても素晴らしいライタに思える。AVR Studioからはちゃんと使えているが、パフォーマンスのいい新しいプロトコルのみの対応。よって、古いプロトコルを使うuispからは使えないとのこと。

uispから書き込むには、古いプロトコルにも対応し、なおかつUSB Serial変換アダプタ経由でも使えるSTK500のようなライタが必要のようだ。

その後、MorosanさんのAVRISP互換ライタは、avrdudeでなら使えるという情報をsenshuさんからいただいた。
AT90S2313のようなレガシーデバイスの場合はエラーが出ていたが、その後のMorosanさんの対応作業のおかげで、avrdudeから、レガシーデバイスであっても問題無く書き込むことができるようになった。
AVRISP互換ライタ対応済みavrdudeのMac OS X用のバイナリは配布していないが、avrdude5.1のソースをもらってきて、Morosanさんのサイトに記載されている変更をし、ビルドすればOK。

AVR Studio 4.12 Service Pack 4で使おうとすると警告メッセージが出ていたが、新ファームで問題無くなった。なおかつ、ターミナルソフト経由で設定変更が可能になっている。EEPROMにバージョン番号を保存してしまうんだね。カコイイ。

MorosanさんのAVRISP互換ライタは、(いろいろ前提条件があるけれども)Mac OS Xユーザにも有用な選択肢になった。
Morosanさんsenshuさん、本当にお世話になりました。

最近のAVR-GCCの仕様変更

最近(といっても、ここ2年ぐらいの話だと思うが)のAVR-GCCは、結構仕様が変わっているらしく、昔のソースはそのままではほぼ動かない。
とても頻用するであろうoutp等が使えなくなくなったことに始まり、少なくとも以下のような変更がある。

outp(PORT, val) は PORT = val に

BV() は _BV() に

sbi(PORT, bit) は PORT |= _BV(bit) に

また、avr/signal.hは、avr/interrupt.hに統合している。
その他、いっぱい仕様変更はあると思われる。

ちなみに、GCC3.x用と思われるMakefileをどこかのサイトから頂戴して流用しようとしたら、コンパイル、hexの生成まですんなりできるものの、うまく動かなかったので注意。原因がどこにあったか、根性が無いので追及しておらず。


objcopyの問題

avr-objcopy -j .eeprom --change-section-lma .eeprom=0 -O ihex main.elf main_eeprom.hex
avr-objcopy: there are no sections to be copied!
avr-objcopy: --change-section-lma .eeprom=0x00000000 never used
make: *** [main_eeprom.hex] Error 1

こんなようなエラーに遭遇するかもしれない。これは、binutilsのobjcopy.cの以下の行のFALSEをTRUEにすると回避できるそうだ。

if (bfd_count_sections (obfd) == 0)
{
non_fatal (_("there are no sections to be copied!"));
return FALSE;
}

情報元

参考サイト

テスト

PORTBにLED付けたAT90S2313でテスト。

ダウンロード at90s2313test.c (0.7K)

適当にソース書く。

avr-gcc -mmcu=at90s2313 main.c -o main.o; avr-objcopy -O ihex main.o main.hex

出来たmain.hexをプログラムして動作すればOK。
どのバージョンのことだよオマエ、と思うことがよくあるので、念のためバージョンも併記しておく。

iMacG5:~/workshop/avr/gcctest $ avr-gcc -v
Using built-in specs.
Target: avr
Configured with: ../configure --target=avr --program-prefix=avr- --enable-languages=c --disable-nls --disable-libssp
Thread model: single
gcc version 4.2.0 20060916 (experimental)

既成の環境を使う

フルスクラッチしなきゃいけないわけじゃない。
ここにGCC3.xの環境だけど、バイナリあり。

Using AVR Microprocessors Under OS/X

Darwinportsにもバイナリがある。バージョンは本日時点のもの。

http://darwinports.com/

avr-gcc (4.0.2)
avr-libc (1.2.5)
avr-binutils (2.16.1)
uisp (20050207)

Finkにもバイナリがあった。intelバイナリもあった。

http://fink.sourceforge.net/index.php?phpLang=en

avr-gcc (3.3.2)
avr-libc (1.0.4)
avr-binutils (2.14)
uisp (20050207)

Source Package

DebianにSource Packageあり。バージョンは本日時点のもの。
適度に枯れたのがよければこれを使えばいいかも。

http://packages.qa.debian.org/g/gcc-avr.html (4.1.0)
http://packages.qa.debian.org/a/avr-libc.html (1.4.4)
http://packages.qa.debian.org/b/binutils-avr.html (2.16.1)
http://packages.qa.debian.org/u/uisp.html

2006.09.15

JavaScript shell (js)、OSSP js 1.6.20060820のZaurus向けパッケージ

autoconf化されてビルドが楽なOSSP版JavaScript shell (js) 1.6.2006082版のZaurus向けパッケージを作りました。mal_blueさん情報ありがとうございました。

JavaScript shellであるところの「js」は、JavaScriptエンジンであるSpiderMonkeyの応用例の一つに過ぎず、SpiderMonkeyそのものじゃないんですね。

以降、JavaScript shell (js)と表記します。

「OSSP-js_1.6.20060820_arm.ipk.bin」をダウンロード

インタラクティブモードのコマンドライン編集のためにGNU Readline 5.1を組み込んであります。

./configure --with-utf8 --with-editline

JavaScript shell (js)についていろいろ分かってきたので書きます。

JavaScript shell (js)のドキュメント

JavaScript shell (js)のドキュメントがありました。
コマンドラインオプションやECMA標準外のことが書いてあります。

Introduction to the JavaScript shell

引数の参照

前のエントリに補足しましたが、引数の参照の仕方が分かりました。
シェバング行を書いて実行権を付け、

#!/usr/bin/env js
for(i = 0; i < arguments.length)
{
print(arguments[i]);
}

上記のように書き、でもって、

$ ./test.js a b c
a
b
c
$

あるいは、-fオプション無しでスクリプトを実行すると引数が参照できます。

js test.js a b c

-fオプション付きだと失敗します。

js -f test.js a b c

ダメ

標準入力から読み取る

var buf = readline();
print(buf);

変数宣言の強制

変数を使う際はvarで宣言しないとエラーが出るようになります。これはいい。

options('strict');


このオプション付きのスクリプト内でundefinedな変数を参照するとエラーで止まるようにもなるので、
undefinedかどうかtypeof()で判定します。

options('strict');

if( typeof( arguments[0] ) != "undefined" )
{
arguments.length;
print( arguments[0] );
}

変数は必ず初期化するか、argumentsならarguments.lengthを見てから参照するのが本道ですが。

Fileオブジェクト

今回のJavaScrip shell (js)はFileオブジェクトが使えます。

Fileオブジェクトのメソッドやプロパティは以下のFreeSwitchのリファレンスのものが適用できるみたいです。例外もありましたが。
FreeSwitchのFileオブジェクトはSpiderMonkey由来のものみたいです。

http://www.voip-info.org/wiki/view/FreeSwitch+Javascript+File

Fileオブジェクトを使って動かしてみたサンプル

// assign string value to variable "buf".

var f = new File("/home/zaurus"); // dir name pass to constructor.
var buf = f.list(); // return directory list

// write to file.

f = new File("list.txt");
f.open("create,write");
f.write(buf);
f.close();

// read from file.

f = new File("list.txt");
f.open("read");
buf = "";
buf = f.readAll();
f.close();
print(buf);

// remove file.

f = new File("list.txt");
f.remove();

関連リンク

JavaScript によるオブジェクト指向プログラミング

javascript-mode.el

JavaScript shell (js)のインタラクティブモードを使った、javascript-shell-mode、javascript-shellというのが定義されてます。
Emacsの中からJavaScript shell (js)!

(再掲/転載モノ)ステップ入力MIDIシーケンサSTed2のZaurus向けパッケージ

2年ほど前、とあるWiKiにSTed2のことを書いたんですが、いつの間にかページが無くなってしまったのでWebArchiveから拾ってきました。というわけで、再掲モノです。

再掲に当たって、各種シーケンサが使用する データファイルを、RCP/R36 ファイルに変換するフィルタ群であるところのrc_convertersと、SMF / RCP / R36 player / converterであるところのSayleenのパッケージも作りました。Sayleenには「RCP / R36 形式のデータを Standard Midi File に変換するコンバータ rcpconv、およびライブラリ librcpconv が収録されています。これがあるとSTed2とDTMソフトとの間を標準MIDIファイルでやりとりできるので、プロトタイピングなんかに使うといいんじゃないでしょうか。

なお、STed2については、michitomo.jpさんの「ザウルスで作曲」が参考になります。

「sted2_20021104-1_arm.ipk.bin」をダウンロード

「sayleen_20021027_arm.ipk.bin」をダウンロード

「rc-converters_20000429_arm.ipk.bin」をダウンロード

今X/Qt入れてないもので、試してません。ごめんなさい。

Sted2

STed2で何ができる?

Zaurus で、いわゆる DTM (Desk Top Music) ができます。

とはいっても、特に何を用意する必要もありません。STed2 と、ソフトウェアMIDI音源 timidity をインストールすれば、それだけで Zaurus が音楽スタジオであるかのようになります。

STed2 が timidity に対して演奏の指示を出し、それを受けて timidity が音を出すわけです。Zaurus の中で完結します。

# こうなるともはや DTM ではなく、PTM (Palm Top Music) ですね。

可能性はそれだけにとどまりません。STed2 で作ったMIDIファイルを timidity に読み込ませて WAV に書き出し、Zaurus での動作実績があるMP3エンコーダ、bladeenc(カビパン男と私)にてそれを MP3 に変換することも可能です(※)。もちろん、計算機資源、そしてバッテリーに余裕があれば、の話ですが。

※今ならARM ShineでMP3エンコードできますね。

なお、STed2 からは MIDI ファイルの一種、RCP ファイルしか書き出せませんが、周辺のユーティリティを使うと標準MIDIファイルにコンバートできます。(たぶん、MAKE 一発で移植可能なはず。(※)そうすれば、セルフでコンバート可能)

※MAKE一発でした。

STed2でどこまでできる?

STed2 は、MS-DOS 時代に高い評価を受け、プロミュージシャンにも愛用された国産MIDIシーケンサー「レコンポーザ」の、非常によくできたクローンです。

その機能特盛りの様子についてはこちら(MIDI Music Composer STed操作マニュアル)をどうぞ。

発音を担当するソフトウェアMIDI音源 timidity は、Zaurus において、16bit / 44.1kHz 時、同時発声??音という程度の働きをします。インストールする音色セット (patch) に音質は左右されますが、「デカデカ zip file(TiMidity だだだだ!)」を導入すれば、それなりの鳴りっぷりです。DDI Pocket の PHS 搭載音源ぐらい?

世界広しといえど、ここまで実用度の高い DTM 環境が整った PDA(PMT?)は Zaurus が初めてです(※)。その意義が何だか分からない人も多いでしょうが、ここでとりあえず「スゴイ!! Zaurus 最強!!」と驚いてください。

※今はWindows Mobileの方が先を行ってます。Griff Pocket Music Studioのようなスゴイのがいくつかあります。

その気になってきたら、早速インストールしてみましょう。

STed2のインストール

ここを見て、X/Qt をインストールしてください。STed2 は、X Window 下で動きます。コンソール下でも動きますが、動作には X のライブラリが必要です。STed2 を使うに当たって日本語表示は必要ではないですが、表示されないと気持ち悪いので、gconv 類、glibc-locale-eucjp、そして画面からはみ出させず、なおかつ日本語表示させるために必要なナガ10フォントのために、xqt-fonts-misc-big まで入れることをおすすめします。
ここ(CreativeStationの「timidityとpatchのいんすとろ~る(笑)」)を見て timidity と patch をインストールします。
このページから STed2 を持っていって、インストールします。
blackbox のメニューから STed2 を起動できるように、/opt/QtPalmtop/share/blackbox/menu に STed2 を登録しておきます。記述例は以下を参照のこと。こうすれば、Fn + 画面タップで出てくるメニューから STed2 を起動できるようになります。注意すべきは、X/Qt を shutdown してから menu ファイルを変更することです。

...
[exec] (Emacs) {emacs}
[exec] (STed2) {sted2}
...

STed2の設定

デフォルトの設定では画面からはみ出てしまいますので、設定をいじる必要があります。設定ファイルは以下です。

/usr/local/lib/sted/sted2.cnf

これをまずは下記のように書き換えます。作業には、管理者権限が必要かもしれません。

* X Window 上で動作する場合の font set 名

#font_name=-\*-fixed-\*-r-normal--12-\*-\*-\* # コメントを外す
*#font_name=-\*-fixed-\*-r-normal--14-\*-\*-\*
*#font_name=-\*-fixed-\*-r-normal--16-\*-\*-\* # コメントアウトする

このように変更すれば、12ドットフォントが使われるようになります。しかし、12ドットフォントでは、実用上問題無いものの、まだちょっと左右がはみ出ます。

Sted12dotfont1

これが気になるなら、以下の行を足して、ほかの行をすべて*でコメントアウトします。

#font_name=-\*-fixed-\*-r-normal--10-\*-\*-\*

すると、10ドットフォントが使われるようになり、画面内に完全に収まるようになります。しかし、ナガ10をインストールしていると以下のような画面になると思います。ナガ10Bが使われているようですが、どうにも見にくい。

Sted210b

自分はナガ10Bを避けてナガ10を明示的に指定する方法がよく分からなかったので、ナガ10Bをアンインストールするという無理やりな方法で対処しました。それは次のような手順で実行します。

1. /opt/QtPalmtop/lib/X11/fonts/misc/ からknj10B.pcf.gz と 5x10B.pcf.gz をどける

2. mkfontdir /opt/QtPalmtop/lib/X11/fonts/misc/

これでfonts.dirを作り直し、X/Qtを再起動します。すると、次のように見やすい画面になります。いささか文字が小さいので、12ドットフォントとどちらを選ぶか、悩むかもしれないですね。

Sted2101

Sted2102

フォントの設定が済んだら、STed2がtimidityを呼び出す際のオプションを変更しておきます。

デフォルトではtimidityのサンプリング周波数が22.05kHzになりますが、SL-C(70|76|86)0 では、timidity のサンプリング周波数を44.1kHz にする方がパフォーマンス的に有利という話なので、sted2.cnfの以下に該当する部分を次のように書き換えます。

#player=1,timidity -idq -f -s22.05

#player=1,timidity -idq -f -s44.1
ひとまず設定はこれで終わりです。

STed2 on Zaurusの問題点

X Window 上で、一部のキーの反応が悪い(コンソールで使う分には問題なし)
STed2のその後ですが、特定のキーの反応が悪い? ようです。
「=+|<>/*_」この辺りの入りがなぜか悪いです。
キーを0.5秒ぐらい押していないと入力されません。
もちろん、rxvt や Emacs では正常に入力できます。
InputHelper と KeyHelper を外してみたのですが、STed2
のみで起きる症状だったので、やっぱり関係無いようでした。
使う際は注意ですね。後々出てくる話だと思うので、
一応書いてみました。
グラフィカルモードへの移行キーである Ctrl+G は、KeyHelper が入っていると、
反応が悪くなるようですね。
Ctrl+G をちょっと長押しするか、KeyHelper を一時停止すれば OK です。
キーが徹底的に足りない(ファンクションキーに割り当てられている機能多数)
音出しは、コマンドを2度発行する必要がある?
もう一つ注意点を挙げるとすれば、PLAY ボタンや、Edit Mode での n や m による
ノートのプレビューにおいては、2 度押ししないと音が出ないことでしょうか。

STed2を使ってみる/ショボいチュートリアル

とりあえず、以下のようにトレースしてください。

[STEP-1]起動~トラック1へのデータ入力

起動

カーソル下で EDIT & SET に合わせ、Enter を押す。

さらに Enter で TR1 のエディットモードに入る。

/ をちょっと押し続ける。勢い余って////と入力されてしまったら、BSで全部消す。

g を(一つだけ)入力して、Enter、さらに Enter。

音色リストが出てくるので適当なものをカーソルで選んで Enter。

c, Enter, d, Enter, e, Enter, f, Enter, g, Enterと入力してみる。

* を少し押し続け、小節線を入力する。

p を2回押してみる。

音が出ましたか?

[STEP-2]トラック2へのデータ入力~音符の個別再生

Esc を1回押して、カーソルを一つ下にやり、TR2 のエディットモードに入る。

/ の後に g で同様に適当な音色を選択。

g3, Enter, a3, Enter, b3, Enter, c4, Enter, d4, Enter と入力。

カーソルを一つ上にやって、n を2回押してみる。d4 の個別再生ができたことを確認。

* を少し押し続け、小節線を入力する。

p を2回押してみる。

音が出ましたか?

[STEP-3]トラック間の行き来~音色の変更

Shift + カーソル左で TR1 に切り換えます。データが入力されたトラック間は、この操作で行き来できます。

一番上の音色チェンジコマンドのデータまでカーソルを移動し、音色名にカーソルを合わせます。

適当な数字キーを押し (例えば2) 、カーソルの下を押します。

すると、音色リストが再び表示されるので、適当にほかのものを選んで Enter。

p を2回押してみます。

どうなりましたか?

[STEP-4]リズムの入力~トラック個別再生

Esc を押して再びエディットモードから抜け、TR10 にカーソルを合わせて Enter。

41, Enter, 40, Enter, 41, Enter, 40, Enter, 41, Enter と入力。

* を少し押し続け、小節線を入力する。

m を2回押してみる。編集中のトラックのみの再生が始まる。

p を2回押してみる。

カーソルを二つ上にやり、K# の欄を 42 に書き換える。書き換えた行にカーソルを合わせ、n を2回押してみる。

ここまでくれば、とっかかりとしては十分ではないでしょうか?

覚悟を決めて、マニュアルに取り組んでみてください。

エディットモードの数値解説

NOTE
音階 (後ろに付く数字はオクターブ指定。c3 と c4 はオクターブ違いのド。B3の次がC4)

K#(キーナンバー)
数値化した音階 (NOTEの別表現で、NOTEとK#は連動。打ち込むときは、どちらの表現も受容)

ST(ステップ)
音の全長 (デフォルトでは48が4分音符、24が8分音符、12が16分音符、16が4分3連。従って、4/4拍子の場合、1小節は192ステップとなる。その小節内の総ステップ数は小節線上に表示される。*で小節線を引くのはとても重要)

GT(ゲート)
音の全長のうち、実際に音を出す長さ。これが小さいとスタッカートに、小さいとスラーになる。

VEL(ベロシティ)
音量

サルベージ元

http://web.archive.org/web/20050316035747/http://ehe.s57.xrea.com/index.php?sted2

2006.09.14

Linux Zaurus SL-C760のSDカードスロット修理(続き)

昨日(さくじつ)のエントリ「Linux Zaurus SL-C700 / SL-C760の分解方法とキーボード換装、SDカードスロット修理の続き。

ペラペラSDカード、KINGMAXのしでかしたおイタは、ロック機構だけにとどまっていなかった。
SDカードスロットのライトプロテクトスイッチ認識機構までも破壊していた。

ライトプロテクトをOFFにしていてもリードオンリーのファイルシステムとしてマウントされてしまうので、困ったことに。
読み出しはできても、ファイルの書き込み、移動、削除ができない。

こうなれば仕方無いということで、ライトプロテクトスイッチ認識機構をだますことを考えた。

SDカードスロットの、開口部に向かって右側の2本の端子がライトプロテクトに関係するもの。
SDカードのライトプロテクトスイッチがOFFの場合は、この2本の端子が導通状態になる。
もちろん、ライトプロテクトスイッチがONの場合はその逆で、絶縁状態になる。

認識機構が破壊されたことで永続的絶縁状態にあったので、この2本の端子をハンダでブリッジしてやった。
とりあえず、これで支障の無い状態に復帰。

KINGMAXみたいなペラペラSDカードはスロットを破壊する可能性があるので、Zaurusが無事なうちに使うのをやめた方がいいかもね。

R0011094

2006.09.13

MP3高速エンコーダARM Shine (Shine Fixed Point) v1.06(改変版含む)のZaurus向けパッケージ

パッケージにcontrolファイルが交じっていたので差し替えました。(9.14-1:47)

整数演算によるアルゴリズムとアセンブラで高速化が図られ、ZaurusでMP3のリアルタイムエンコードを実現したMP3エンコーダ、ARM Shine (Shine Fixed Point)というものがあります。
ARM ShineなんだかShine Fixed Pointなんだかよく分かりませんが、コマンドの出力はARM Shine v1.06なので、これに統一します。

ARM ShineはGabriel Bouvigne氏作MP3エンコーダShine release 0.1.2をベースにPete Everett氏がAcorn/RISC OS機向けに整数演算処理化したもので、そのARM ShineをMarkus氏がZaurus向けに「quick and dirty port」したcomprec 0.02に含まれるARM Shineを、Mac OS X上でクロスコンパイルしたものをZaurus向けパッケージにしました。
Markus氏版はバージョンを名乗ってないので、パッケージ的にはPete Everett氏のARM Shine v1.06であるということにします。

ダウンロード ARM-Shine_1.06_arm.ipk.bin (43.6K)

パッケージには、コマンド「shine」、「shine44」を含みます。

comprec 0.02はコマンドshineとPython/Qtで作られたフロントエンド(GUI)で構成されていますが、SL-5500の解像度を前提としたものであること、そしてPyQt(参考:塚本さんの記事/参考:PyQt for SL-A300)は日本国内では一般的でないので、収録は保留しています。

参考までにQT Designerで開いたcomprec同梱uiファイルのスクリーンショットを貼っておきます。

Comprec

折角uiファイルが添付されているのでrbuic/ui2rbでRuby/Qteに持っていけるかなと思ったら、rbuic/ui2rbはRuby/Qt2用で、Ruby/Qteでは使えないんですね。PyQtならQT Designerからuiファイルを持ってこられるって、結構デカいですね。

ARM Shine v1.06自体はサンプリングレートが32.0kHz固定となっていますが、44.1kHzにしたものを作りました。コマンド名を「shine44」としてあります。32.0kHzのものもコマンド名「shine」として同梱してあります。改変点はpatchとして後で貼ります。

このARM Shine、何回か某所で紹介しましたが、名前が「Shine」ということもあって煽ってるものと勘違いされました。

……そんなことはどうでもいいとして、Zaurus上でMP3エンコードしてもつまんねーよ、と思うなかれ。
/dev/dspからの、つまりマイクからの音声をMP3にリアルタイムエンコードできるのです。

AGC(Auto Gain Control)付きマイク内蔵のiPAQ + Resco Audio Recorderの実用度の前には飯事同然ですが、録音後にGPSからのlat/lng、PHSの位置情報をid3tagで埋め込む、PIMデータから予定の件名を埋め込むなどのアレゲな遊びで自己満足に浸りましょう。

使用例

基本形。マイク端子からの音を、直接MP3にエンコード。これがARM Shineのレーゾンデートルというべき使用方法でしょう。

shine -ps -b 64 /dev/dsp rec.mp3

標準のボイスレコーダで録音したWAVをエンコードすることも可能です。

shine44 recording01.wav rec.mp3

22秒の16bit/44.1kHzのWAVを14秒で128kbpsのMP3にエンコードできました。
128kbpsなら実時間以下でエンコード可能です。

-rw-r--r-- 1 zaurus qpe 337711 Sep 12 00:00 rec.mp3
-rw-r--r-- 1 zaurus qpe 1859628 Sep 12 00:00 recording01.wav

オチ

MP3リアルタイムエンコードというものに、恋慕に近い特別な感情を抱く自分は、ARM Shineがお気に入り。
ただこれ、自分の環境では音が飛んじゃうみたいですね。何か曲を録音してみると分かりやすいと思います。
実用はやっぱり無理か!?
4桁機種ではどうなんでしょうか。

自分のバイナリが疑わしい人(自分でも疑わしい)は、comprec 0.02に含まれるshineを試してみてください。

パッチ

パッチというほどのものではありませんが、32.0kHzを44.1kHzにするパッチ。

--- comprec-0.02/wave.c Mon Feb 17 06:53:11 2003
+++ comprec-0.02m/wave.c Tue Sep 12 21:02:22 2006
@@ -108,7 +108,8 @@
header.length = 500000;
header.channels = 1;
header.bit_samp = 16;
- { int speed = 32000;
+ /* 2006.09.12 modified by komugi 32000 -> 44100 */
+ { int speed = 44100;
int channels = 1;
int format = AFMT_S16_LE;
if (ioctl(fileno(config.wave.file), SNDCTL_DSP_SETFMT, &format)) {

Mac OS X上でコンパイルするためのMakefileの変更です。

--- comprec-0.02/Makefile Mon Feb 17 06:53:11 2003
+++ comprec-0.02m/Makefile Tue Sep 12 17:12:35 2006
@@ -1,8 +1,7 @@
-ZROOT=/home/zaurus/develop
CC_NATIVE=gcc
-CC=$(ZROOT)/arm/bin/arm-linux-gcc
-AS=$(ZROOT)/arm/bin/arm-v4l-linux-as
-STRIP=$(ZROOT)/arm/bin/arm-v4l-linux-strip
+CC=arm-linux-gcc
+AS=arm-linux-as
+STRIP=arm-linux-strip
IPKG_BUILD=./ipkg-build

CFLAGS+=-Wall -O2 -fno-exceptions -g
@@ -29,7 +28,7 @@
pyuic Maindlg.ui > Maindlg.py

table1.h table2.h: tables
- tables
+ ./tables

tables: tables.c
$(CC_NATIVE) -o $@ $(CFLAGS) $< -lm
@@ -64,6 +63,7 @@
depend: .depend

.depend:
- makedepend -f - -- $(CFLAGS) -- $(CSOURCES) > .depend
+ /usr/X11R6/bin/makedepend -f - -- $(CFLAGS) -- $(CSOURCES) > .depend

include .depend
+# DO NOT DELETE

Linux Zaurus SL-C700 / SL-C760の分解方法とキーボード換装、SDカードスロット修理

愛機SL-C760のSDカードスロットにKINGMAXのペラペラSDカードを挿入したら、何かの拍子に変な入り方をしてしまい、SDカードのロック機構がバカになってしまった。

「SL-C760 分解」等でググると、案外ヒットしない。
このままだとほとんどゴミなので、観念して出たとこ勝負の分解を決意。
今回は分解レポート。分解方法はSL-C750、SL-C860も同様だと思われる。
一切の保障は無し。試す場合は自己責任で。

ところで、そろそろ3桁機種を使っている人はキーボード交換の時期ではないだろうか。
自分のSL-C760のキーボードは押し心地が固くて打鍵音が大きく、SL-C700より打ちにくくなったという印象が元からあったのだが、最近表面の樹脂シート部分が伸びたのか、フカフカ浮いてきて、いよいよ辛い状態になっていた。

某所で書いたら、一言「指から変な汁が出てんじゃね?」

できるかどうか分からないが、ついでに塩漬け状態のSL-C700からキーボードを移植してしまおう。

分解:ケースを開けるまで

バッテリケース周囲の3本のビスを抜く

R0011064_

CFカードスロットの左右の2本のビスを抜く

R0011065__1

SDカードスロット左右のビス2本を抜く

R0011066_

筐体の上半分と下半分の間の合わせ目に爪を入れて分離させる。
筐体上半分が下半分にはまり込む形なので(受け口を連想してみよう)、筐体下半分を外に押し広げるように外していく。

R0011067_

筐体周囲を1周回り込むように外していくと筐体下半分が外れる。

R0011071_

ケースを外すときに一緒に外れる小さい部品

この部品はここにはまる。二つあるが、本来は1個。

R0011070_

ロックスイッチはこの位置。筐体下半分にはめておく。

R0011070_

筐体上半分(キーボード)と液晶+マザーボードの分離

基板上の黒いビスを4本外す。スポンジの裏に1本あるので見落とさないように。

R0011072__1

キーボードがつながるフラットケーブルを外す。

R0011073_

黒いロックする部品を下に引っ張り出すようにしてから、フラットケーブルを外す。

R0011074_

ヒンジ部分のカバーとなるパーツを外す。端からねじるようにしながら外していく。

R0011075_

ヒンジ部のカバーが外れた状態。

R0011076_

左右のヒンジを固定する2本の少し大きいビスを外す。
液晶につながるこのフラットケーブルは脆弱なので、これを傷つけないように注意。
断線したら即座にゴミ箱に投げ捨てろ!

R0011081_

ビスを外したら液晶を180度に開いてから、ヒンジのパーツを梃子でこじるようにして外す。

R0011083_

分離成功。ちなみに、SL-C760はGND線が半田付けされた銅テープが貼り付けてあるので、これを丁寧にはがす。移植先に貼るためだ。半田付けしてあるものを一度外すと作業しやすい。

R0011084_

SL-C700では、そのGND線はヒンジ部品に巻きつけてあるだけなので面倒が無い。

R0011087_

これがSL-C760のヒンジ部分の銅テープ製のGNDランド(?)。

R0011088_

SL-C700の調子のいいキーボードを得て、蘇ったSL-C760。
一方、SL-C760の使えないキーボードを得て、本格的にどうにもならなくなったSL-C700。アディオス!
この写真は、SL-C760のキーボードのフカフカした感じがよく分かるね。俺の変な汁に乾杯!

モバイル専科、若松通商PS/PLAZA等でZaurusのキーボード部分が単体で入手できるので、買って交換してみてはいかが?

R0011091_

ロックがバカになったSDカードスロットの修理

写真中央、スロット角のすき間から金色の部品が覗いている場合は、それを精密マイナスドライバーなどで手前側、SDカードスロットの入り口方向に押し込む。自分の場合はこれで直った。

R0011061_


Linux Zaurus SL-C760のSDカードスロット修理(続き)に続く。

2006.09.11

デジカメRAWファイル現像コマンドdcraw 8.37とliblcms 1.15のZaurus向けパッケージ

デジタルカメラで記録したRAWファイルを現像し、PPMもしくはTIFFファイルに変換する著名なソフトウェアであるdcraw 8.37をZaurus向けにコンパイルしたもの、そしてdcrawが依存するライブラリ、Little cms 1.15 (liblcms)をZaurus向けにコンパイルしたものをパッケージにしました。
Little cmsには、コマンドicc2ps、icclink、icctrans、jpegicc、wtptを含みます。

「dcraw_8.73_arm.ipk.bin」をダウンロード

「Little-cms_1.15_arm.ipk.bin」をダウンロード

dcrawのZaurusでの実用度は未知数

実用度は、メモリが厳しいのでそこそこでしょうか。
ZaurusでRAWファイルが現像できることに感動できる向きは試してみてください。

例によってRICOH GR DIGITALのDNGファイル(8M pixel)を現像してみたところ、残念ながらメモリが足りずターミナルごと落ちました。
swap有でもダメです。Half Sizeで現像する-hオプションを付けたらswap無しでも現像可能でした。
-hオプション付きで現像にかかった時間は、time計測でreal 1m40s、user 24s、sys 1m12s(SL-C760)。

Nikon COOLPIX 5000(E5000)のRAW(NEF)、診断モードで記録できるRAWファイル(5M Pixel)は共に、-hオプションを付けず現像できました。
現像にかかった時間はtime計測でreal 4m13s、user 1m22s、sys 2m42s、-hオプションを付けた場合はreal 1m10s、user 12s、sys 54s。
-hオプション付きでいいなら、それなりに実用的かもしれません。

T2

写真はE5000で撮影した診断モードのRAWファイルを、「dcraw -c -h -w dscn3364.jpg | cjpeg >t.jpg;epegfe 2 t.jpg t2.jpg」といった感じで処理をしたもの。光源は白熱灯で、未処理のためホワイトバランスが取れてませんが、-rオプションを詰めれば調整可能のはず。ちなみに、E5000の診断モードで記録したRAWファイルは、拡張子が.jpgです。

Dscn3379_s

こっちの写真はE5000の通常のRAWファイル(NEF)を同様にして現像したもの。何でも食ってくれそうな勢い。

使用例

dcraw -h /mnt/cf/dcim/100ricoh/r0011057.dng

現像されたファイルr0011057.ppmが出来ます。

dcraw -h -T /mnt/cf/dcim/100ricoh/r0011057.dng

PPMファイルの代わりにTIFFファイルが書き出されます。
しかし、PPMファイルやTIFFファイルを書き出せても、うれしい人は少ないかと。

dcraw -h -c /mnt/cf/dcim/100ricoh/r0011057.dng | cjpeg > r0011057.jpg

-cは標準出力に書き出すオプション。パイプを通してjpeg-progsのcjpegに渡すとJPEGに変換できます。

dcraw -e -c /mnt/cf/dcim/100ricoh/r0011057.dng | cjpeg > r0011057_thumbnail.jpg

-eは埋め込みのサムネイルを抽出するオプション。

dcrawのコマンドラインオプション

パラメータを変更して調子をいじることができます。
-aはホワイトバランスを自動的に調整するオプション。
ブライトネス、黒色点を設定するオプション、画像を回転させるオプションなどなど、いろいろ面白そうなオプションがありますね。
フジのハニカムCCDに関すると思われるオプションなんかもあります。

Raw Photo Decoder "dcraw" v8.37
by Dave Coffin, dcoffin a cybercom o net

Usage: dcraw [options] file1 file2 ...

Valid options:
-v Print verbose messages
-c Write image data to standard output
-e Extract embedded thumbnail image
-i Identify files without decoding them
-z Change file dates to camera timestamp
-a Use automatic white balance
-w Use camera white balance, if possible
-r Set raw white balance (four values required)
-b Adjust brightness (default = 1.0)
-k Set black point
-H [0-9] Highlight mode (0=clip, 1=no clip, 2+=recover)
-t [0-7] Flip image (0=none, 3=180, 5=90CCW, 6=90CW)
-o [0-5] Output colorspace (raw,sRGB,Adobe,Wide,ProPhoto,XYZ)
-o Apply output ICC profile from file
-p Apply camera ICC profile from file or "embed"
-d Document Mode (no color, no interpolation)
-D Document Mode without scaling (totally raw)
-q [0-3] Set the interpolation quality
-h Half-size color image (twice as fast as "-q 0")
-f Interpolate RGGB as four colors
-B Apply bilateral filter to reduce noise
-j Show Fuji Super CCD images tilted 45 degrees
-s Use secondary pixels (Fuji Super CCD SR only)
-4 Write 16-bit linear instead of 8-bit with gamma
-T Write TIFF instead of PPM

ZaurusでCronInetとMewによるメールの定期巡回

CronInetという、電源を落としていても定期的にネットにつないでコマンドを実行してくれる便利なZaurus用スクリプトがある。モバイルの可能性を広げてくれる、素晴らしいものだ。

fetchmailと連携して使う例しか紹介されてないけど、fetchmailはモバイル向きじゃない。理由はメールのサイズの閾値を設定できても、はじくことしかできない(ようだ)からだ。
はじかれたメールの存在をMUAから簡単に知ることはできない。
(いや、手はいくらでもあるだろうけど、めんどくさい)
だからといって、10MBとか普通に添付してくるメールを受け取るのも現実的でない。
添付を落とすような転送をかけて、ワンクッション置けばいいんだけどね。

モバイル的には、メールの先頭だけ受信して、後で用があらば選択受信したい。
検索という鬼門はあるものの、モバイルにおけるMUAは、それができるMewが最有力。

Mewの弱点は、Emacsの中で動くという性質上、外部からのキックでメールを受信させることが難しいことだ。

ゆえに、CronInetなどというヨダレもののスクリプトがあっても眺めているしか無かった。しかし、ElispやEmacsへの理解が進んで壁を越えることができたので書いておこう。

実現のキーはemacsclient

実現のキーになるのは、emacsclient。emacsclientは、起動中のEmacsにTCP/IP経由で引数を渡すことができるコマンドだ。

emacsclientを使うには、.emacs.elに

(server-start)

と書いておく。emacsclientは-eオプションでEmacsにElispを評価させることができる。これでMewのメール受信関数をキックしてやる、というのがアイデアの骨格になる。つまり、Emacsの外からメール受信を開始させられるのだ。

以下に紹介するスクリプト「mew-cron-retrieve.sh」をfetchmailの代わりにCronInetで定期実行してやると、Mewでメールの送受信ができる。

Emacs側の準備

以下を.emacs.el等に追加する。

;;emacsclientを使えるようにする
(server-start)

;;mew-cron-retrieve
(defun mew-cron-retrieve()
""
(interactive)
(defvar mew-cron-retrieve nil)
(defvar mew-cron-busy nil)
(if mew-cron-retrieve
(progn
(setq mew-cron-busy t)
(mew-summary-retrieve)
)
nil)
)

(add-hook 'mew-init-hook
(function
(lambda ()
(setq mew-cron-retrieve t)
)))

(add-hook 'mew-quit-hook
(function
(lambda ()
(setq mew-cron-retrieve nil)
)))

(add-hook 'mew-pop-sentinel-hook
(function
(lambda ()
(setq mew-cron-busy nil)
)))

(add-hook 'mew-send-hook
(function
(lambda ()
(setq mew-cron-busy t)
)))

(add-hook 'mew-smtp-flush-hook
(function
(lambda ()
(setq mew-cron-busy t)
)))

(add-hook 'mew-smtp-sentinel-hook
(function
(lambda ()
(setq mew-cron-busy nil)
)))

Mewのメール送受信は非同期処理なので、メール送受信を指示しても、送受信終了を待たずに制御が戻ってしまう。そのまま事後処理に入ってメールの送受信中にPPPを切断してしまうことが無いよう、add-hookして、処理中を示すフラグを上げ下げしている。
pop開始時のhookが無かったのでhookを追加しようとしたが、これはemacsclientからのキック時にやってやればいいことなので、run-hook追加はやめた。

CronInetからキックするシェルスクリプト

自分はmew-cron-retrieve.shという名前にしている。
これをCronInetでキックする。

#!/bin/sh

export LD_LIBRARY_PATH=/home/QtPalmtop/lib
export QPEGROUP=qpe
export QTDIR=/home/QtPalmtop
export QPEDIR=/home/QtPalmtop
export QPEUSER=zaurus

logfile="/home/zaurus/mew-kicked-log.txt"
ps x | grep -e ' emac[s]' >/dev/null
if [ $? ] ; then
echo "emacs found."
emacsclient -e '()' >/dev/null 2>&1
if [ "X$?" = "X0" ] ; then
echo "emacs server found."
emacsclient -e '(mew-cron-retrieve)'
echo "checking..."
while [ "X`emacsclient -e 'mew-cron-busy'`" = "Xt" ]; do
sleep 1
# debug print
# emacsclient -e 'mew-cron-busy'
done
echo "done."
echo "kicked at `date '+%Y-%m-%d %H:%M:%S'`" >> $logfile
echo "" | sudo ntpdate eric.nc.u-tokyo.ac.jp >> $logfile
fi
fi

sleep 5
while ifconfig ppp0 >/dev/null 2>&1; do
netctl -d >/dev/null 2>&1
sleep 5
done

Emacs内の変数mew-cron-busyを見て、それがtの間は「待ち」としている。
CronInet側での切断がうまく動かないので、このスクリプト内で切断までやってしまっている。
ログを取ったり、時刻合わせをしたりは余計かもしれないので、要らない人は削除してね。

少々不安定なことがあるものの、勝手にスリープから起きてPPP接続、メール巡回、ntpdateによる時刻合わせ、PPP切断、スリープ移行、という一連の動作ができ、常に最新のメールがMewのInboxに入っているので、Zaurusの利用価値が倍増した。

Mewの受信件数読み上げ

ついでに受信件数読み上げというのもやってみた。
自分は音声合成が大好きだ。ボコーダーとかも好き。
だから、やらねばなるまい。

zaurusで動作実績のある音声合成ソフトが二つある。
一つはflite。もう一つはMBROLA。

↓flite
http://www.speech.cs.cmu.edu/flite/download.html
↓MBROLA本体(音素ファイルとかは別途必要)
http://tcts.fpms.ac.be/synthesis/mbrola/bin/pocketlinux/mbr301h.zip

後者は日本語まで喋れる上に品質が高いものの、専用の発音表記のマクロを書かなければならず、お手軽じゃない。前段にhuman readableなテキストからマクロを生成する別のソフトが必要。また、再生には生成したデータをsoxで変換し、/dev/dspに流し込んでやる必要があるなど、何かと面倒。それにちょっと重い。

一方のfliteは扱いがとても簡単。

flite -t "Speech test."

これだけ。
というわけで、fliteを使ってMewで受信したメールの件数を読み上げる、というのをやってみた。整数を引数に取り、読み上げる関数を書いた。これを.emacs.elとかに書いておく。
1通以上だと"mails"になるという小技入り。

(defun read-off-number-of-retrieved-mail (n)
""
(interactive)
(cond ((= n 1)
(setq read-off-number-of-retrieved-mail-postfix " mail.\""))
((> n 1)
(setq read-off-number-of-retrieved-mail-postfix " mails.\""))
(t
(setq read-off-number-of-retrieved-mail-postfix " mail.\""))
)
(call-process-shell-command
(concat
"flite -t \"You got "
(int-to-string n)
read-off-number-of-retrieved-mail-postfix
))
)

でもって、mew-pop.elのmew-pop-sentinelの中に適宜この関数を挿入する。
書き換えたのが以下(Mew 4.2.52)。
僕は書き換えたので上書きしてしまった。
rttlという変数に、受信件数が整数型で入っている。

(defun mew-pop-sentinel (process event)
(let* ((pnm (process-name process))
(directive (mew-pop-get-directive pnm))
(mdb (mew-pop-get-mdb pnm))
(sshpro (mew-pop-get-ssh-process pnm))
(sslpro (mew-pop-get-ssl-process pnm))
(rttl (mew-pop-get-rttl pnm))
(dttl (mew-pop-get-dttl pnm))
(left (mew-pop-get-left pnm))
(bnm (or (mew-pop-get-bnm pnm) (current-buffer)))
(flush (mew-pop-get-flush pnm))
(kils (mew-pop-get-kils pnm))
(hlds (mew-pop-get-hlds pnm))
(uidl (mew-pop-get-uidl pnm))
(done (mew-pop-get-done pnm))
(error (mew-pop-get-error pnm))
(file (mew-expand-folder bnm mew-pop-msgid-file))
(buf (process-buffer process))
(thread-info (mew-pop-get-thread-info pnm)))
(mew-pop-debug "POP SENTINEL" event)
(set-process-buffer process nil)
(set-buffer bnm)
(mew-summary-mark-recover mdb)
(mew-remove-buffer buf)
(if (not done)
(let* ((rtrs (mew-pop-get-rtrs pnm))
(lefts (length rtrs))
(uid (nth 1 (car rtrs)))
recovered)
(mew-pop-message pnm "POP connection is lost")
(when (mew-pop-get-dispatched pnm)
(cond
((eq directive 'scan)
;; uidl is reversed.
(setq uidl (cdr (member uid uidl)))
(mew-lisp-save file uidl nil 'unlimit)
(setq recovered t))
((eq directive 'inc)
;; uidl is reversed.
(setq uid (assoc uid uidl))
(setq uidl (cdr (member uid uidl)))
(mew-net-uidl-db-set (mew-pop-passtag pnm) uidl)
(setq recovered t)))
(when recovered
(mew-pop-message
pnm
"%d message retrieved. %d messages are left due to an error"
(- rttl lefts) lefts)
(mew-summary-folder-cache-save))))
(if thread-info (mew-summary-retrieve-message-for-thread thread-info))
(cond
(error
;; retain the error message
)
((eq directive 'biff)
(funcall mew-biff-function rttl))
((eq directive 'sync)
(mew-pop-message pnm "Synchronizing messages...")
(mew-net-folder-sync bnm hlds)
(mew-pop-message pnm "Synchronizing messages...done"))
((eq directive 'inc)
(mew-biff-clear)
(mew-net-uidl-db-set (mew-pop-passtag pnm) uidl)
(cond
((= rttl 0)
(mew-pop-message2 pnm "No new messages" left))
((= rttl 1)
(mew-pop-message2 pnm "1 message retrieved" left)
(read-off-number-of-retrieved-mail rttl)
(mew-summary-folder-cache-save))
(t
(mew-pop-message2 pnm (format "%d messages retrieved" rttl) left)
(read-off-number-of-retrieved-mail rttl)
(mew-summary-folder-cache-save))))
((eq directive 'get)
(cond
((= rttl 0)
(mew-pop-message2 pnm "No new messages" left))
((= rttl 1)
(mew-pop-message2 pnm "1 message retrieved" left)
(read-off-number-of-retrieved-mail rttl)
(mew-summary-folder-cache-save))
(t
(mew-pop-message2 pnm (format "%d messages retrieved" rttl) left)
(read-off-number-of-retrieved-mail rttl)
(mew-summary-folder-cache-save))))
((eq directive 'scan)
(mew-biff-clear)
(cond
((= rttl 0)
(mew-pop-message pnm "No messages scanned"))
((= rttl 1)
(mew-pop-message pnm "1 message scanned")
(mew-lisp-save file uidl nil 'unlimit)
(mew-summary-folder-cache-save))
(t
(mew-pop-message pnm "%d messages scanned" rttl)
(mew-lisp-save file uidl nil 'unlimit)
(mew-summary-folder-cache-save))))
((eq directive 'exec)
(when kils
(mew-mark-exec-unlink bnm kils)
(mew-mark-kill-invisible)
(mew-summary-folder-cache-save))
(cond
((= dttl 0)
(mew-pop-message pnm "No messages deleted"))
((= dttl 1)
(mew-pop-message pnm "1 message deleted"))
(t
(mew-pop-message pnm "%d messages deleted" dttl))))))
;;
(mew-net-status-clear (mew-pop-get-status-buf pnm))
(mew-info-clean-up pnm)
(set-buffer-modified-p nil)
(mew-summary-unlock)
(if (and (processp sshpro) (not mew-ssh-keep-connection))
(process-send-string sshpro "exit\n"))
(if (and (processp sslpro) (not mew-ssl-keep-connection))
(delete-process sslpro))
(unless (eq directive 'biff)
(run-hooks 'mew-pop-sentinel-non-biff-hook))
(run-hooks 'mew-pop-sentinel-hook)
(when (and mew-auto-flush-queue flush)
(mew-smtp-flush-queue mew-case))))

これでメールを自動巡回して、メールがあったら受信件数読み上げ、というアレゲな環境が完成。
本当は、音楽を聞いているところにメールが届いたら、一時的に音楽再生を中止して、音声合成でお知らせ、読み上げが終わったら音楽再生再開、というのをやろうと思ったけど、標準搭載のプレイヤーはリモコンできない。madplayやmpg123なんかにシグナル送って一時停止ってのはできないだろうか。
MPDというのがあって、これをZaurusで動かしている人も居るみたいだけど、Mac OS Xで動かしてみたら負荷がかかると音が途切れ途切れ。Zaurusで大丈夫なのかな。

2006.09.10

最新版GSPlayer v2.25(GSPlayer2)のビルド方法

20060910101504


20060910101250

「GSPlayer2」と検索してくる人が多いようなので、GSPlayer2のビルドを再試してみました。
断っておきますが、バイナリ配布はしてません。
改変版の配布は制限されていませんが、cppのソースをいじるほどの技量はありません。

mixi stationへの間接対応のためにログ取り機能の追加ができないかとソースを調べてみましたが、やっぱりVC++は無理だ……。
再生系の関数にファイルパスが渡っていれば、それを横取りしてファイルに書き出そうと思ったんですけどね。

現在のバージョンはv2.25aで、8月にリリースされたものですが、これが最終バージョンとなる予定であることがドキュメントに書いてありました。
一連の紆余曲折によって、本来あるべき配布形態が取られずにいたことが本当に残念でなりません。
最近Ruby界隈で話題になっているようですが、フリーソフトは政治なんかではなく、恋愛みたいなものではないかと思ってます。

ビルドはMicrosoft eMbedded Visual C++ 4.0を使って行ないます。無料の統合開発環境です。

それを例によってダウンロードし、使えるようにします。
このToru TAKAHASHIさんのページを参考にすれば、だれでもできるでしょう。
eVC++ 4.0、eVC++ 4.0のサービスパッチ、PPC2003 SDK、PPC2003のエミュレータを順次インストールすればOK。
エミュレータは、ひょっとしたら要らないかも。

GreenSoftwareさんからGSPlayer2のソースコードをいただいてきます。前述の通り、現在のバージョンはv2.25です。

愛機がiPAQ h2210なので、ターゲットは「Win32 (WCE ARMV4) ReleaseXScale」とします。

作業開始

アーカイブを解凍します。「\d:\gsplayer」に解凍したと仮定して説明します。
Microsoft eMbedded Visual C++ 4.0を起動します。

libmadのビルド

「ファイル>ワークスペースを開く」から、「D:\gsplayer\libmad\libmad.vcw」を開きます。
「アクティブなWCE構成」を「POCKET PC 2003」に、「アクティブな構成の選択」を「Win32 (WCE ARMV4) ReleaseXScale」にして、F7キーを押します。
以降、ワークスペースを開いたら、「アクティブなWCE構成」と「アクティブな構成の選択」がこの通りになっていることを確認しながら作業を進めます。話をF7キーを押したところまで戻します。libmadのビルドは警告がたくさん出ますが、「libmad.lib - エラー 0、警告 47」となって終われば大丈夫なようです。

libovdのビルド

「ファイル>ワークスペースを開く」から、「D:\gsplayer\libovd\libovd.vcw」を開きます。
「アクティブなWCE構成」を「POCKET PC 2003」に、「アクティブな構成の選択」を「Win32 (WCE ARMV4) ReleaseXScale」にして、F7キーを押します。

libovdのビルドもまた警告がたくさん出ますが、「libovd.lib - エラー 0、警告 47」となって終われば大丈夫なようです。

madplayのビルド

「ファイル>ワークスペースを開く」から、「D:\gsplayer\maplay\maplay.vcw」を開きます。
「アクティブなWCE構成」を「POCKET PC 2003」に、「アクティブな構成の選択」を「Win32 (WCE ARMV4) ReleaseXScale」にして、F7キーを押します。

madplayのビルドはすんなり行きます。「madplay.lib - エラー 0、警告 0」となって終わるでしょう。

GSPlayer2のビルド

いよいよGSPlayer2のビルドです。

「ファイル>ワークスペースを開く」から、「D:\gsplayer\GSPlayer2\WinCE_PPC2\GSPlayer2.vcw」を開きます。
「アクティブなWCE構成」を「POCKET PC 2003」に、「アクティブな構成の選択」を「Win32 (WCE ARMV4) ReleaseXScale」にします。
「アクティブなWCE構成」の隣にある「既定のデバイスの選択」をPOCKET PC 2003 Device」にしてデバイスとActiveSyncを開始し、F7キーを押します。

「GSPlayer2.exe - エラー 0、警告 0」で終わると思います。
終わるやいなや、ActiveSync中のデバイスに出来たバイナリがコピーされます。
コピー先はルートディレクトリです。

これがうまく行かない場合は、「D:\gsplayer\bin\jpn\WinCE_PPC2\ARMV4Relx\GSPlayer2.exe」にバイナリが出来ますので、これをデバイスにコピーしてください。

その他のプラットフォームについて

自分では試せないので、上記を参考に試してみてください。
現在GSPlayer2は「Windows Mobile 2005」にも対応してます。この場合は、「Visual Studio 2005 Standard Edition」でビルドするんですかね。
相応のSDKも必要になるでしょう。

ただ、上記の手順で作ったバイナリは、H/PC系を除き、各種WMで動くと思います。

最新版の使用感

前回の記事ではメニューがおかしいと書きましたが、今回ビルドしたものは直っていました。

また、Y.Nagamidori氏は、最近の版でバスブーストの改良を連綿と行なっているようです。
音割れで使えなかった記憶があるので早速試してみると、うまい調整で実用的な音質になってました。
音割れしません。これは素晴らしいかも。

REALbasicのマルチスレッドと同期機構関連機能

ファイルのダウンロードなど、時間がかかる処理を実行する際、単にメソッドを呼び出しただけでは処理終了まで操作不能になってしまう。
時間がかかる処理はスレッド内で実行すると、そのようなことにはならない。
ぜひともスレッドを使おう。

普通のメソッドをスレッド化する手順

1.プロジェクトウインドウで右クリック、追加からクラスを選択等の方法でプロジェクトにクラスを追加する。

2.「Class1」となっているデフォルトのクラス名から名前を適当に変更し、追加したクラスの「Super」を「Thread」にする。説明の便宜上「myThread」というクラス名にしたと仮定。

3.「myThread」内にイベントハンドラ「Run」が現れるので、ここにボタンの「Action」等に書かれている(処理に時間のかかる)メソッドをコピペする。メソッド内にオブジェクトへの参照が含まれる場合は、適切な形に直す必要がある。

例) EditField1.Text = "hoge" → Window1.EditField1.Text = "hoge"

4.今までメソッドを直接記述していたボタンの「Action」には、例えば以下のように書く。

Dim t As New myThread
t.run

これで、これだけでスレッドとして実行できる。

スレッドに引数を渡す

当然、スレッドに引数を渡したくなるだろう。
しかし、runイベントには引数を渡せない。
myThread内にプロパティを作り、それを引数代わりに使うのだと思われる。
例えば、「s」というString型のプロパティを作ったとする。
値を代入しておき、しかる後にrunするといった感じになる。

Dim t As New myThread
t.s = "test"
t.run

runイベントの中では、プロパティ「s」の値を使えばいい。

myThread内にメソッドを追加できる。スコープ次第で外から引数を渡しつつ実行できるが、この場合はスレッドとしての実行にならないので注意。
runイベントから呼び出す分にはOK。

複数のスレッドを実行する

この辺りから情報が怪しくなってくるので注意。
まー日本語で書かれた情報が無いよりはいいでしょう?

同じスレッドをたくさん実行したい場合、どうするか?
myThread型の配列を宣言したくなるが、これはうまくいかない。
myThread型の変数に対して繰り返しNewすればいいようだ。

dim t As myThread
dim i as integer

for i = 0 to 10
t = new myThread
t.s = "test" + str(i)
t.run
next

ただ、これだと複数スレッドの実行自体はうまくいくものの、特定のスレッドを操作できないので不都合がある。
これ以上のことはよく分からん。

スレッドのメソッドとプロパティ

最近のREALbasicはスレッド関係が強化されていて、プロパティ、メソッドともに増えている。
詳細はリファレンス参照。

プロパティ

Priority: 優先度。引数で与えられた数字が大きいほど高いCPU占有度で実行される。引数は1〜10
StackSize:
State: スレッドの状態を4段階で表現
ThreadID: UNIXにおけるプロセスIDみたいなもの。スレッドそれぞれにユニークな番号が割り振られる

メソッド

Kill: スレッドを停止
Resume: Suspend状態のスレッドを再活性化
Run: 実行
Sleep: 引数に与えられたミリ秒分スレッドを一時停止。タイムアウト後は自動的に再活性化
Suspend: スレッドをResumeが実行されるまで永久的休眠状態へ移行

REALbasicの三つの同期機構について

マルチスレッド、またはアプリケーションの多重起動が想定される環境で共有のリソースにアクセスする際には、スレッド/プロセス間の衝突を防ぐための同期機構が必要になる。
REALbasicには、Semaphore、CriticalSection、Mutexの三つが用意されている。

Semaphore

Window等のプロパティ等、スレッドから見えるところにパブリックスコープでSemaphore型の変数を用意しておき、

sm as Semaphore

Openイベントなどスレッド実行前にインスタンスを作っておく。

sm = new Semaphore

そして、myThread内の、共有リソースへのアクセスを行なうメソッドの前後を、

sm.Signal
sm.Release

で囲む。例えば、

sm.Signal
// ファイルへ書き出し処理
sm.Release

などとする。イメージとしては、Signalが入場券発行所、Releaseが入場券回収所みたいな感じだ。
その「入場券」は、有限のものとして設定される。同時に「場内」に進入できるのは「入場券」の枚数次第となる。

Semaphoreのコンストラクタに渡す引数が、その「枚数」設定。
引数は、管理するリソースの数に合わせて設定する。例えば五つまで同時アクセス可能なデータベースへのアクセスを行なうメソッドを制御するなら、

sm = new Semaphore(5)

などとしてインスタンスを生成する。これによって、実行が同時五つまでに抑制される。デフォルトは1。

あるスレッドがsm.Signalを実行した時点でSemaphoreの値が0の場合は、Semaphoreが1以上になるまで保留状態に置かれ、そのスレッドの処理はそこで止まり、Semaphoreが1以上になった時点で処理が再開される。
TDLの人気アトラクションで、入場制限がかかっている状態を連想するといい。

CriticalSection

コンストラクタに引数を渡さないSemaphoreのデフォルトとほぼ同じ動作。
Semaphoreと違って、コンストラクタに引数は渡せない。管理できるリソースの数は一つだけ。
Signalの代わりにEnter、Releaseの代わりにLeaveを使う。

Windowオブジェクト等にcriticalSection型のPropertyをパブリックスコープで作る。

cs as criticalSection

Semaphore同様Openイベント等でスレッド実行前にインスタンスを生成しておく。

cs = new CriticalSection

そして、myThread内の、共有リソースへのアクセスを行なうメソッドの前後を、

cs.Enter
cs.Leave

で囲む。ほとんどSemaphoreと同じ。

CriticalSectionはSemaphoreと違って、複数回Enterできる。複数回のEnterからリソースを開放するには、同数のLeaveが必要。
再帰処理において使うのだと思われる。

Mutex

最近のREALbasicにはMutexもある。
アプリケーション内のみならず、OSワイドなスコープを持つ。
同じマシン上で実行されているREALbasicアプリケーションから参照可能。
複数のアプリケーションから一つのリソースを使用する際の調停や、多重起動を抑止するために使える。

Appオブジェクト内にプライベートなスコープのMutex型のPropertyを作る(これがミソ)。

mx as Mutex

AppオブジェクトのOpenイベントハンドラでインスタンス生成。

mx = new Mutex("myapp")

CriticalSection同様の使い方をするほか、TryEnterメソッドの返り値を判定して多重起動を抑止するなど。
既に同じ引数で生成されたインスタンスがあれば、それらとの間で同期処理が行なわれる。

if not mx.TryEnter Then
MsgBox "Please only use one instance of My Spiffy Application at a time"
Quit
end if

CriticalSection同様、Enterを複数回実行可能。もちろん、リソースの開放には、同回数のLeaveが必要。

関連リンク

TaskMng

まつもとひろゆきさんのスレッドクラス。とても便利そうだけど、いまいち自分の脳みそがどういう実装にしていいか思いついてくれない。
オブジェクト指向への理解が足りないからだと思われる。

暗号化されていないので、ソースを読み解いた暁にはスレッドへの真の理解が開けるのではないか。

OOP University:パート 26

REALbasic university Japanのスレッドの回。

2006.09.08

JPEG加工ユーティリティ集jpeg-progs 6bのZaurus向けパッケージ

libjpegの添付ユーティリティ集であるところの、jpeg-progs 6bのZaurus向けパッケージを作りました。

ダウンロード jpeg-progs_6b_arm.ipk.bin (114.8K)

libjpegに依存しますが、これは標準で入っていると思います。


jpegtran(JPEG加工ツール)
cjpeg(JPEGエンコーダ)
djpeg(JPEGデコーダ)
wrjpgcom(JPEGコメントライター)
rdjpgcom(JPEGコメントリーダ)

が含まれます。

使用例等

個人的にはjpegtranが昔からお気に入り。これはロスレスでJPEGの加工ができます。
例えば、縦位置で撮影したデジカメのJPEGファイルを、以下のようにすると劣化無く回転できます。

jpegtran -copy all -rotate 90 /mnt/cf/somefile.jpg > /mnt/cf/somefile90.jpg

-copy allはEXIF情報を保持するためのオプション。構えが逆の人は、-rotateを270にします。
微妙に処理後はサイズが変わりますが、これはそういうものらしいです。

なお、jpeg-progsに含まれるコマンドはストリーム指向なので、リダイレクトするか、パイプにつないでください。

一度画像を展開して処理するため、5M(2592x1944)の画像がギリギリ。
これでもメモリが足りず、処理終了後にターミナルごと落ちました。
実メモリが必要らしく、swapは無効です。
3M(2048x1536)の画像は大丈夫で、1枚2.1秒で済みました(SL-C760)。ImageMagickのconvertだと、もっとかかるんではないかな。

R0011044_ss
↑epegfe 8 1.jpg 2.jpg; jpegtran -rotate 90 2.jpg>3.jpgという感じで処理したもの。嘘か誠か3264x2176の画像1点1.050秒で処理できました。epegfeで処理した時点でEXIFは消えてしまいますが。

Zaurusで撮影したスクリーンショットは縦位置のBMPですが、これを横位置のJPEGにコンバートするには、以下のようにします。元が小さいから、ImageMagickで問題無くできますけどね。

cat /mnt/cf/Screen_Files/scrn001.bmp | cjpeg -quality 90 | jpegtran
-rotate 270 >/mnt/cf/Screen_Files/Itwasprocessed.jpg

使用のヒント

jpegtranでどの画像を回転させるか? これについてはアイデアがあります。DPOFを使うのです。
アレです。プリンタでプリントする画像をデジカメ側で指定できる仕組み。
DPOFを使ってプリントする画像を選択すると、恐らくメディアのルートに/MISC/AUTPRINT.MRKというテキストファイルが出来ます。ここに選択した画像のパスが記録されるのです。例えば、こんな風に。

[HDR]
GEN REV = 01.10
GEN CRT = "RICOH GR Digital "
[JOB]
PRT PID = 001
PRT TYP = STD
PRT QTY = 001
IMG FMT = EXIF2 -J
<IMG SRC = "../DCIM/100RICOH/R0011046.JPG">
[JOB]
PRT PID = 002
PRT TYP = STD
PRT QTY = 001
IMG FMT = EXIF2 -J
<IMG SRC = "../DCIM/100RICOH/R0011044.JPG">

これをアレしてコレすればわりと簡単にいくんではないでしょうか。

プレビューが高速で表示され、画像を複数選択でき、任意のコマンドにファイルパスを渡せるソフトウェアがあったら教えてください。

2006.09.07

高速JPEG縮小ライブラリEpeg 0.9.0とコマンドepegfe 0.0.1、EXIF情報表示exiftags 1.00のZaurus向けパッケージ

Epeg 0.9.0 / epegfe 0.0.1パッケージ

高速JPEG縮小ライブラリEpegをZaurus向けにコンパイルしたものをパッケージにしました。

ソース

また、そのライブラリを使用するコマンド「epegfe」を作ったので、それも配布します。

RICOH GR DIGITALで撮影した2.3MB〜2.7MB(3264x2176)の画像10点、計24.8MBの画像を1/8に縮小するのに、17.4秒(SL-C760)しかかかりません。1枚なら1.7秒。1/4にすると、大体その倍の3秒かかります。
例えば、こんな感じで使います。カレントディレクトリにあるjpgのサムネイルを作る例です。

$ cd /mnt/cf/dcim/100ricoh
$ mkdir thumbnail
$ for i in *.jpg; do epegfe 8 $i thumbnail/`basename $i .jpg`_s.jpg; done

epegfeの第一引数は整数を指定します。「8」と指定すると、元画像の1/8に縮小されます。
epegfeの第二引数は、元画像のファイル名です。第三引数は、処理後の保存ファイル名。

ただし、補完が入ってないので、第一引数は2の乗数にすることをおすすめします。
さもないとガタガタになります。

Epegライブラリ
ダウンロード Epeg_0.9.0_arm.ipk.bin (283.7K)

epegfe(コマンド)
ダウンロード epegfe_0.0.1_arm.ipk.bin (2.5K)

↓epegfeで元画像の1/8に縮小したサンプル
R0011041_s

exiftags 1.00パッケージ

jpegからexif情報を読み出して、標準出力に書き出すコマンド、exiftagsをZaurus向けパッケージにしました。

exiftags 1.00
ダウンロード exiftags_1.00-1_arm.ipk.bin (74.7K)

exifのタイムスタンプ読み書き「exiftime」、exifのコメント読み書き「exifcom」も同梱です。

参考までに、exiftagsにRICOH GR DIGITALで撮影した画像を読ませた結果を貼っておきます。
適当に加工して、ブログやmixiへの投稿時に添付画像のスペックとして付記したり、投稿テンプレートの自動生成をするとよろしいんではないでしょうか。

Camera-Specific Properties:

Equipment Make: RICOH
Camera Model: GR Digital
Maximum Lens Aperture: f/2.3

Image-Specific Properties:

Image Orientation: Top, Left-Hand
Horizontal Resolution: 72 dpi
Vertical Resolution: 72 dpi
Image Created: 2006:09:07 05:09:43
Exposure Time: 1/23 sec
F-Number: f/4.0
Exposure Program: Aperture Priority
ISO Speed Rating: 154
Lens Aperture: f/3.9
Brightness: 0.8 EV
Exposure Bias: 0 EV
Metering Mode: Pattern
Light Source: Unknown
Flash: No Flash, Compulsory
Focal Length: 5.90 mm
Color Space Information: sRGB
Image Width: 3264
Image Height: 2176
Exposure Mode: Auto
White Balance: Auto
Scene Capture Type: Standard
Sharpness: Normal

« August 2006 | Main | October 2006 »

blogparts

  • Last.fm
  • twitter

Recent Comments

無料ブログはココログ