SVX日記

2004|04|05|06|07|08|09|10|11|12|
2005|01|02|03|04|05|06|07|08|09|10|11|12|
2006|01|02|03|04|05|06|07|08|09|10|11|12|
2007|01|02|03|04|05|06|07|08|09|10|11|12|
2008|01|02|03|04|05|06|07|08|09|10|11|12|
2009|01|02|03|04|05|06|07|08|09|10|11|12|
2010|01|02|03|04|05|06|07|08|09|10|11|12|
2011|01|02|03|04|05|06|07|08|09|10|11|12|
2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|07|08|09|10|11|12|
2021|01|02|03|04|05|06|07|08|09|10|11|12|
2022|01|02|03|04|05|06|07|08|09|10|11|12|
2023|01|02|03|04|05|06|07|08|09|10|11|12|
2024|01|02|03|

2011-05-01(Sun) 布製ハチロク

  なんでも、ウチのガキが通っている幼稚園は、スモックにオリジナルデザインを施すのが流儀らしい。そういうことなら、アレをデザインしてみようか。適当に拾ってきた画像の上に「文字通り」レイヤを被せる。

  画像の説明

  で、買ったばかりのプリンタで印刷。型紙を作って、フェルトを切り抜く。

  画像の説明

  縫いつけるのはカミさんの仕事。間違いなく「アノ車」である。

  画像の説明

  しかし、幼稚園で頭文字Dにハマってるのは、ウチのガキだけだと思うのだが、これでよかったのだろうか……。


2011-05-02(Mon) スプレーブースほか

  長い休みなのに、チマチマとした工作ばかりだが、アレコレと製作していく。まずはコレ。

  画像の説明

  ガキの食事が遅いのは、メシ食いながら、ナプキンの端っこを左手でイジイジしているのが原因だと思い、クリアファイルの端っこを切って、イジイジ止めを作ってみた。それだけだとイヤがるかもしれんので、ウケを狙い、プリンタでちょっとしたイラストを付けてみる。

  夜に枕元に置いておいたら、朝から大はしゃぎで使い始めた。しめしめ。食う速度もそこそこ向上した気がする。

  ハチロクだけだとサミしいというので、インプも追加。こっちは難度が高かったが、どうにかそれっぽく見える程度に仕上がった。

  画像の説明 画像の説明

  本格的に、塗装スキルが加わってきたので、前から構想していた、排気機能のついたスプレーブースを作ってみることにした。

  画像の説明

  箱に12Vのファンとスイッチを設ける。ファンは先日購入したサーバからハズしたモノ。12Vの電源はアダプタを利用。

  画像の説明 画像の説明

  まぁ、それだけのモノといえば、それだけのモノ。

  画像の説明 画像の説明

  今回も缶コーヒーのオマケの入っていた容器を利用してみた。しかし、この類のスイッチをハメ込む加工はハンドニブラあれば楽々。ないと地獄だ。

  画像の説明

  裏の倉庫の中を塗装ブースにしてみた。外コンセントを付けておいたおかげで、照明もファンも無理なく利用できる。よかった。

  画像の説明

  あまり深く考えずに作ったものの、排気の能力には概ね満足できたが、単に後ろに排気するだけでは、当然ながら前に回り込んでくる。というわけで、予定になかったが、無理矢理ダクトを付ける。イキナリ雑な作りになってしまった。

  画像の説明

  とはいえ、ダクトの効果は十分だった。気に入ってなかった青色を灰色に塗り直した。満足!

  画像の説明

本日のツッコミ(全1件) [ツッコミを入れる]

横須賀のアランプロスト [排出のファンが小さすぎる予感。 プラモ塗料メーカー市販のブースはもっとでかいぞなもし]


2011-05-05(Thu) こどもの日、散歩

  大須に塗料と電池ボックスを買いに行く。

  画像の説明

  栄行きのバスだったので、なんとなくチャンピオンカレーで昼飯しようかと、終点まで行って地下に降りたら。地下の日産のショールームでめざとくGTRを見つけ、大興奮のイッペイ。

  画像の説明

  イニシャルDを愛読し、グランツーリスモ3を嗜む5歳児だが、自分で運転したい車はワゴンR……なんでだぁッ!?


2011-05-06(Fri) 買っちまった★マギカ

  画像の説明

  結局、買っちまった……Blu-ray版でなく、いまさらながらのDVD版。しかし、当然ながら、28型ハイビジョンブラウン管で観れば、ニコニコとは雲泥。PSPで観てたときは、マミが最後に落ちてきたお茶を飲んでいることには気づかなかった……んが、それ、飲むか? フツー。

  画像の説明

  Blu-ray版を買おうか迷ったけども、PCでの再生もリッピングもできないんじゃ、どうにもつまんないんだよなぁ。まぁ、例の友人も買ってるし「『アイツのものはオレのもの』だからいつでも観られる」とジャイアニズムを心に持っておけばいいや。

  しかし、DVDを買うなんざ「メガゾーン23のDVDボックス」以来だ。

  ま、それはさておき、このタイミングで届いたにもかかわらず、いまだに「誤ったセリフが収録されているバージョン」だった。

  画像の説明

  まぁ、そのうち交換を依頼してみようかな。


2011-05-07(Sat) 印刷&塗装祭り

  突然だが、PSPのマーキングは、しつこく爪でコスると、キレいに剥がれる。知ってた?

  画像の説明

  で、例の★マギカだが、いまさらながらDVD版を買ったのだから、いろいろと遊んでみることにする。

  先日、以前から気になっていた「虐殺器官」を購入して読み始めた。以前も書いたが、わしゃ、いわゆるブックカバーというヤツが大嫌いである。ここ何年か、読むときは外して、保管。読み終わったら戻して本棚へ、というパターンである。ちょくちょく読む技術書なんかは、廃棄。しかしながら、やたらベロベロしないカバーなら、その限りではない。で、こんなものを作ってみる。

  画像の説明

  対象の文庫に実寸合わせして、折り目と切り込みを入れて。

  画像の説明

  こんな感じ。上下からも挟む形なので、テープなどを使わずとも、容易には外れない。ブックカバーにすることを意識しながら、好きなシーンを探すもよし。今回は、中に入れた本とカバーに関連はないが、アニメ化された原作に好きなシーンを被せるもよし。自分で撮った写真を使うもよし。

  GIMP用の画像ファイルを置いておく。150dpiで印刷するとちょうど良いようになっている。

  しかし、いつの間にか「ハヤカワトールサイズ」なんてのが出てたのか。オイラの手持ちの文庫で一番多いのがハヤカワだが、これは市販のカバーが使えなくなり、一般に迷惑な話な気がするなぁ……たかが数ミリって、イヤがらせやん。ま、今回みたいに楽しんで自作すれば問題ないけども。

  画像の説明

  はいつぎ。一昨日、購入してきたミラクルデカールのクリア(KT-001CL)を使って、やってみたかったオリジナルデカール作りにチャレンジしてみる。とりあえず、習作として「例の目玉」と「RedSuns」デカールを作ってみる。

  GIMP用の画像ファイルを置いておく。こっちは300dpiで印刷するとちょうど良いようになっている。

  画像の説明

  練習台は、その時に目の前に在ったモノ。あっというまに「プレ・シェーブ・キュゥべえ」のできあがり。「僕と契約して、ヒゲを剃ってほしいんだ」。

  顔料インクということもあって心配したが、特に問題ないどころか、想像以上に完璧な仕上がりだ。このデカールシート、少々値段は張るが、3枚も入っており、ここまでキレイに仕上がるのだから、よい買い物だ。

  画像の説明

  次は「RedSuns」のマーキング。黙ってガキに見せたら、間髪入れず「れっどさんずだッ!!」だと。アンタは、いつのまに英語まで覚えてんだい……。

  画像の説明

  しかし、吹いたクリアが足りなかったのか、立て続けに2枚を失敗。クリアは厚めに吹く必要がある。追加で吹いてどうにか成功。

  画像の説明

  さて、冒頭のブツ。サフェーサを吹いて、ホワイトを吹いて、と……。

  画像の説明


2011-05-08(Sun) 痛PSP化★マギカ

  ウチのガキが工作教室で車を作ってきた。なんでも、文太のインプレッサを意識したようで、貼った折り紙の色のチョイスは見事なのだが、メタリックのブルーは1枚しかなかったらしく、工作としては潔くそれだけ。

  他の子はペットボトルのキャップなどもデコレーションしていたようだが、ウチのガキの車は超シンプル。なんでも、一度は付けてみたが、インプにはそんなモノ付いていない、と考えて取り外したらしい。ストイックすぎだろ。

  画像の説明

  と、ここでイキナリだが、パーツはかわいらしいにもかかわらず、ナゼにこんなに禍々しいのか、と評判のキュウべえ先生が登場。

  画像の説明

  ベールを剥がすと、PSPの背面のUMDスロットが痛い状況になっている!

  画像の説明

  「僕はUMDを何でもひとつ再生してあげる。なんだって構わない、どんなゲームだって遊ばせてあげられるよ。だから僕と契約し……」「あの……UMD持ってないんですが……」「……PSP持ってるのにUMDを1枚も持ってないなんて、わけがわからないよ」

  マスキングが甘かったとか、目の間隔がちょっと狭かったとか、反省点はあるが、塗装+オリジナルデカールの習作としてはかなり満足の行くデキ。

  しかし、どうせやるなら、もっともっと痛くしてもよかったかな……あ、電池ボックスのフタの部分が空いていることに気づいた、ような……。


2011-05-10(Tue) チープなDTMアプリLinuxへ

  ふと思うところがあって、5年近く以前に自作したDTMアプリを引っ張り出してきた。当時は、まだWindowsを使っていたっけなぁ。主にRubyで書き、Cygwin上で動かし、実際に作曲に利用したアプリだ。プログラムの構成どころか、使い方も含めて、かなり記憶が曖昧になっているが、そういう場合こそブログの記録が役に立つ。自分のブログからパッケージをダウンロードして、説明を読みながらLinux上で動かしてみる。

$ ./melod
./melod:17:in `initialize': No such file or directory - /dev/dsp (Errno::ENOENT)
	from ./melod.org:17:in `open'
	from ./melod.org:17
 
# ls /dev/dsp
ls: cannot access /dev/dsp: そのようなファイルやディレクトリはありません

  素直に動かネェだろうなぁ、と思ったら、いきなり動かネェ。そもそも/dev/dsp自体がネェってさ。/dev/dspって、ALSAの前身の、OSSってヤツが提供しているんじゃなかったっけ? デバイスファイルなんだから、カーネルモジュールなんじゃネェの?

# find /lib/modules/`uname -r` -name "*oss*"
/lib/modules/2.6.32.16-150.fc12.x86_64/kernel/drivers/scsi/osst.ko
/lib/modules/2.6.32.16-150.fc12.x86_64/kernel/sound/core/oss
/lib/modules/2.6.32.16-150.fc12.x86_64/kernel/sound/core/oss/snd-pcm-oss.ko
/lib/modules/2.6.32.16-150.fc12.x86_64/kernel/sound/core/oss/snd-mixer-oss.ko
/lib/modules/2.6.32.16-150.fc12.x86_64/kernel/sound/core/seq/oss
/lib/modules/2.6.32.16-150.fc12.x86_64/kernel/sound/core/seq/oss/snd-seq-oss.ko
 
# modprobe snd-pcm-oss
 
# ls /dev/dsp
crw-rw----+ 1 root audio 14, 3 2011-05-09 09:42 /dev/dsp
 
# chmod 666 /dev/dsp

  ……って思ったら、思った通りだった。それっぽいモジュールをロードしたら、アッサリと/dev/dspが出現した。ちなみに/dev/dspは、音の波形(PCM)データを書き込むと音が鳴る、という概念のデバイスファイルだ。

  改めて、melodを起動する。

$ ./melod
7fff0009
./melod:24:in `ioctl': Invalid argument - /dev/dsp (Errno::EINVAL)
	from ./melod.org:24
	from ./melod.org:17:in `open'
	from ./melod.org:17

  これだけじゃ動かネェだろうなぁ、と思ったら、やっぱり動かネェ。今度はなんだ? ioctlのパラメータがおかしいって?

  ioctlってのは、デバイスに対する「読み書き以外のアレコレ」を一手に引き受ける、ジャンク箱みたいなヤツだ。Cygwinの環境と、Linuxの環境とでは、要求コードのマジックナンバが違っているとか? 定義を探してみる。

$ grep -r SNDCTL_DSP_SETFRAGMENT /usr/include
/usr/include/linux/soundcard.h:#define SNDCTL_DSP_SETFRAGMENT		_SIOWR('P',10, int)
/usr/include/linux/soundcard.h:#define SOUND_PCM_SETFRAGMENT		SNDCTL_DSP_SETFRAGMENT
 
$ vi /usr/include/linux/soundcard.h
 536 #define SNDCTL_DSP_RESET        _SIO  ('P', 0)
 537 #define SNDCTL_DSP_SYNC         _SIO  ('P', 1)
 538 #define SNDCTL_DSP_SPEED        _SIOWR('P', 2, int)
 539 #define SNDCTL_DSP_STEREO       _SIOWR('P', 3, int)
 540 #define SNDCTL_DSP_GETBLKSIZE       _SIOWR('P', 4, int)
 541 #define SNDCTL_DSP_SAMPLESIZE       SNDCTL_DSP_SETFMT
 542 #define SNDCTL_DSP_CHANNELS     _SIOWR('P', 6, int)
 543 #define SOUND_PCM_WRITE_CHANNELS    SNDCTL_DSP_CHANNELS
 544 #define SOUND_PCM_WRITE_FILTER      _SIOWR('P', 7, int)
 545 #define SNDCTL_DSP_POST         _SIO  ('P', 8)
 546 #define SNDCTL_DSP_SUBDIVIDE        _SIOWR('P', 9, int)
 547 #define SNDCTL_DSP_SETFRAGMENT      _SIOWR('P',10, int)

  定義は見つかったが、マクロを噛んでてなんのこっちゃわからん。要るところだけ、頭を使わないで解決する。

$ vi ioctl_resolv.c
#include <stdio.h>
#include <linux/soundcard.h>
 
int main() {
	printf("%x\n", SNDCTL_DSP_SETFRAGMENT);
	printf("%x\n", SNDCTL_DSP_SPEED);
	printf("%x\n", SNDCTL_DSP_SETFMT);
	printf("%x\n", SNDCTL_DSP_CHANNELS);
	printf("%x\n", SNDCTL_DSP_GETFMTS);
	printf("%x\n", SNDCTL_DSP_GETOSPACE);
}
 
$ cc -o ioctl_resolv ioctl_resolv.c
 
$ ./ioctl_resolv 
c004500a
c0045002
c0045005
c0045006
8004500b
8010500c

  解決。要求コードの上位バイトだけが、少し違っているようだ。直接、melodのコードを修正し、改めて、melodを起動する。

$ ./melod
./melod:17:in `initialize': Device or resource busy - /dev/dsp (Errno::EBUSY)
	from ./melod:17:in `open'
	from ./melod:17

  ビジー出た。これも、やや想定通り。最近のLinuxはALSAの上にPulseAudioというサウンドデーモンが載っており、各アプリの音声出力をソフト的にミキシングしているので、直接に/dev/dspにアクセスするのはよろしくない。

  RubyでPulseAudioに対応するには……と調べたところ、OSS用のラッパーが用意されており、そいつを噛ませば、従来のOSS向けコードを、そのままPulseAudio対応にすることができるらしい。

$ padsp ./melod
7fff0009
./melod:25:in `ioctl': Invalid argument - /dev/dsp (Errno::EINVAL)
	from ./melod:25
	from ./melod:17:in `open'
	from ./melod:17

  あで? 再びioctlのパラメータがおかしいって? そんなわけないんだが……デバッグモードで走らせてみる。

$ padsp -d ./melod
utils/padsp.c: dsp_open()
utils/padsp.c: fd_info_new()
utils/padsp.c: dsp_open() succeeded, fd=3
7fff0009
utils/padsp.c: unknown ioctl 0xffffffffc004500a ★
utils/padsp.c: freeing fd info (fd=-1)
utils/padsp.c: Draining.
./melod:25:in `ioctl': Invalid argument - /dev/dsp (Errno::EINVAL)
	from ./melod:25
	from ./melod:17:in `open'
	from ./melod:17

  なんか、頭に「f」がいっぱい付いてしまっている。ioctlの引数って、32ビット幅じゃないんか? 勝手に64bit拡張して渡してしまうRubyもRubyだが、そのまま受け取って処理しようとするpadspもpadspって感じ。

  正直、これには参った。Ruby側でいろいろやってみたが、どうにもならない。どっちが原因かわからんが、どっちかをどうにかする必要がある。Rubyをイジるとオオゴトになりそうなので、padsp側をどうにかしてみることにする。要するに、padsp側のソースコードをイジって、処理の直前で32ビット幅で切ってしまうように修正し、パッケージを作り直すわけだ。ソースをダウンロードしてビルドする。

$ which padsp
/usr/bin/padsp
 
$ rpm -qf /usr/bin/padsp
pulseaudio-utils-0.9.21-4.fc12.x86_64
 
# yumdownloader --source pulseaudio-utils
 
# rpm -ivh pulseaudio-0.9.21-6.fc12.src.rpm
 
# rpmbuild -bp rpmbuild/SPECS/pulseaudio.spec

  ソースビルドに必要なパッケージが大量に不足している。yum installで全部入れたら、ソースビルドに成功した。修正すべきコードを探す。

# cd rpmbuild/BUILD/pulseaudio-0.9.21/
 
# ctags -R *
 
# grep -r "unknown ioctl" *
src/utils/padsp.c:            debug(DEBUG_LEVEL_NORMAL, __FILE__": unknown ioctl 0x%08lx\n", request);
 
# vi src/utils/padsp.c
   1497 static int mixer_ioctl(fd_info *i, unsigned long request, void*argp, int *_errno) {
   1498     int ret = -1;
   1499 
   1500     switch (request) {
   1501         case SOUND_MIXER_READ_DEVMASK :
   1502             debug(DEBUG_LEVEL_NORMAL, __FILE__": SOUND_MIXER_READ_DEVMASK\n");
   1503 
   1504             *(int*) argp = SOUND_MASK_PCM | SOUND_MASK_IGAIN;
   1505             break;
 
   1638         default:
   1639             debug(DEBUG_LEVEL_NORMAL, __FILE__": unknown ioctl 0x%08lx\n", request);
   1640 
   1641             *_errno = EINVAL;
   1642             goto fail;
   1643     }
   1644 
   1645     ret = 0;
   1646 
   1647 fail:
   1648 
   1649     return ret;
   1650 }
 
   1912 static int dsp_ioctl(fd_info *i, unsigned long request, void*argp, int *_errno) {
   1913     int ret = -1;
   1914 
 
   1925     switch (request) {
   1926         case SNDCTL_DSP_SETFMT: {
   1927             debug(DEBUG_LEVEL_NORMAL, __FILE__": SNDCTL_DSP_SETFMT: %i\n", *(int*) argp);
   1928 
   1929             pa_threaded_mainloop_lock(i->mainloop);
   1930 
   1931             if (*(int*) argp == AFMT_QUERY)
   1932                 *(int*) argp = map_format_back(i->sample_spec.format);
   1933             else {
   1934                 map_format((int*) argp, &i->sample_spec);
   1935                 free_streams(i);
   1936             }
   1937 
   1938             pa_threaded_mainloop_unlock(i->mainloop);
   1939             break;
   1940         }
 
   2020         case SNDCTL_DSP_SETFRAGMENT:
   2021             debug(DEBUG_LEVEL_NORMAL, __FILE__": SNDCTL_DSP_SETFRAGMENT: 0x%08x\n", *(int*) argp);
   2022 
   2023             pa_threaded_mainloop_lock(i->mainloop);
   2024 
   2025             i->fragment_size = 1 %lt;%lt; ((*(int*) argp) & 31);
   2026             i->n_fragments = (*(int*) argp) >> 16;
   2027 
   2028             /* 0x7FFF means that we can set whatever we like */
   2029             if (i->n_fragments == 0x7FFF)
   2030                 i->n_fragments = 12;
   2031 
   2032             free_streams(i);
   2033 
   2034             pa_threaded_mainloop_unlock(i->mainloop);
   2035 
   2036             break;
 
   2304         default:
   2305             /* Mixer ioctls are valid on /dev/dsp aswell */
   2306             return mixer_ioctl(i, request, argp, _errno);
   2307 
   2308 inval:
   2309             *_errno = EINVAL;
   2310             goto fail;
   2311     }
   2312 
   2313     ret = 0;
   2314 
   2315 fail:
   2316 
   2317     return ret;
   2318 }
 
   2323 int ioctl(int fd, unsigned long request, ...) {
 
   2347     if (i->type == FD_INFO_MIXER)
   2348         r = mixer_ioctl(i, request, argp, &_errno);
   2349     else
   2350         r = dsp_ioctl(i, request, argp, &_errno);
 
   2359     return r;
   2360 }

  最後のところで32ビット幅で切ってしまおう。パッチを作る。

# cd ..
 
# mv pulseaudio-0.9.21 pulseaudio-0.9.21.my
 
# rpmbuild -bp /root/rpmbuild/SPECS/pulseaudio.spec 
 
# mv pulseaudio-0.9.21 pulseaudio-0.9.21.org
 
# cd pulseaudio-0.9.21.my/
 
# vi src/utils/padsp.c
 
# cd ..
 
# diff -r -U 3 pulseaudio-0.9.21.org pulseaudio-0.9.21.my
diff -r -U 3 pulseaudio-0.9.21.org/src/utils/padsp.c pulseaudio-0.9.21.my/src/utils/padsp.c
--- pulseaudio-0.9.21.org/src/utils/padsp.c	2011-05-09 12:46:22.000000000 +0900
+++ pulseaudio-0.9.21.my/src/utils/padsp.c	2011-05-09 12:48:46.000000000 +0900
@@ -2345,9 +2345,9 @@
     }
 
     if (i->type == FD_INFO_MIXER)
-        r = mixer_ioctl(i, request, argp, &_errno);
+        r = mixer_ioctl(i, request & 0xffffffff, argp, &_errno);
     else
-        r = dsp_ioctl(i, request, argp, &_errno);
+        r = dsp_ioctl(i, request & 0xffffffff, argp, &_errno);
 
     fd_info_unref(i);
 
# vi ../SPECS/pulseaudio.spec 
 
# cd ../SPECS/
 
# cp pulseaudio.spec pulseaudio.spec.org
 
# vi pulseaudio.spec
 
# diff -U 3 pulseaudio.spec.org pulseaudio.spec
--- pulseaudio.spec.org	2010-11-21 08:43:14.000000000 +0900
+++ pulseaudio.spec	2011-05-09 12:53:34.000000000 +0900
@@ -69,6 +69,7 @@
 Patch60: 0061-esd-simple-use-pa_memblockq_pop_missing.patch
 Patch61: 0062-core-rework-how-stream-volumes-affect-sink-volumes.patch
 Patch62: 0063-legacy-dir.patch
+Patch63: 0064-for-melod.patch
 URL:            http://pulseaudio.org/
 BuildRoot:      %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 BuildRequires:  m4
@@ -342,6 +343,7 @@
 %patch60 -p1
 %patch61 -p1
 %patch62 -p1 -b .legacyDir
+%patch63 -p1
 
 %build
 autoreconf
 
# cd ../BUILD
 
# diff -r -U 3 pulseaudio-0.9.21.org pulseaudio-0.9.21.my > ../SOURCES/0064-for-melod.patch

  パッケージビルドして、パッケージアップデートの形でインストール。

# rpmbuild -ba /root/rpmbuild/SPECS/pulseaudio.spec 
 
# rpm -Fvh ../RPMS/x86_64/pulseaudio-* 

  5度目の正直。うりゃッ!!

$ padsp -d ./melod

  ようやく、動いたっぽい。改めて、PCのキーボードを、そのままピアノのキーボード化する「konk」を立ち上げる。

$ ./konk

  音が出たッ……と思った矢先にmelod側が落ちた。バッファサイズが足りなかったらしい。適当に倍に増やす。

 	ringbuf = Array.new(fragsize * 24, 128)						# リングバッファ(みたいに使う)

  ようやく、キーボードがキーボードとして動くようになった。ちょっと音が途切れ途切れだが、音を採る分には不自由はない。

  とりあえず★マギカとして、ClariSの「コネクト」の冒頭部分について「konk」を使って音を採ってみる。コードはここを参考にして……と、思ったら「C6」とか「Dsus4」とか未対応のコードがあるではないか。この辺りの概念を作ったのはずいぶん前のことなので、音に関する知識が脳からページアウトしてしまっている。Wikipediaを読んで和音音程についての情報の再呼び出しを図る。

  脳へのページインが済んだところで、対応する修正を入れてみれば、ほんのちょっとの追加で済んだ。過去のオレ、ナイスジョブ。

*** chord.rb.u8.org 2011-05-09 13:19:48.000000000 +0900
--- chord.rb    2011-05-06 00:46:15.000000000 +0900
***************
*** 32,43 ****
--- 32,50 ----
  # Minor-6th-chord                 :Cm6            根音+短3度+長3度+長2度   (長6度)
  # Aug.-7th-chord                  :Caug7  C7+5    根音+長3度+長3度+短3度   (短7度?) 
  
+ # Suspended-4th-chord             :Csus4          根音+完全4度+長2度
+ # 7th-Suspended-4th-chord         :C7sus4         根音+完全4度+長2度++短3度
+ 
    @@RULES = Hash[
        '',         [0, 4, 3], 
        'm',        [0, 3, 4], 
        '7',        [0, 4, 3, 3], 
        'M7',       [0, 4, 3, 4], 
        'm7',       [0, 3, 4, 3], 
+       '6',        [0, 4, 3, 2],
+       'm6',       [0, 3, 4, 2],
+       'sus4',     [0, 5, 2],
+       '7sus4',    [0, 5, 2, 3],
    ]   
  
    @@OCTAVES = Array.new

  MMLにコードを追記して、MIDIファイルにエンコードする。

$ cat connect.mml | ./plexor

  と、MIDIファイルを生成したところでフト気づいた。Linuxで、MIDIファイルを演奏させたい場合、誰にやらせればいいんだ? 試しにファイルをOperaにツッコんだところ、Totemらしいヤツが出てきてgstreamer-plugins-bad-free-extrasを入れろと言われた。

# yum install gstreamer-plugins-bad-free-extras

  これまた、大量のパッケージが必要に。全部入れ……ようとしたら、gstreamer-plugins-goodと衝突して入らない。なんじゃそりゃ。

  そっち方面をあきらめ、いろいろと探すと、timidityという単独のMIDIデコーダが見つかった。入れてみる。

# yum install timidity++

  再生してみる。

$ timidity midi/connect.mid

  おぉ、ちゃんと音が出た。悪くない。悪くはないぞぉ。<midiを再生する>

  ……というようなことをやりつつ、ゴールデンウィークは過ぎゆくのであった。でも、実はこれは「あること」に対する前哨戦だったりする。つづく。


2011-05-14(Sat) ワイパーブレード交換セズ

  一部では、成人式を迎えている個体もあるSVXであるが、ウチのS40IIはもうすぐ17歳の誕生日。ひいき目に見ても、デザイン的にはまだまだ古さを感じさせないとは思ってはいるが「過去のアイドルの目の小じわ」ではないものの、どうしても細部はくたびれてきている。

  一番目立つのがこのワイパー。オイラも笑えなくなりつつあるが、いわゆるアーム部分がハゲチョビンである。オマケにブレード部分に、かなりヒドいサビも進行している。いっそブレードは交換して、アームの部分はちょっと塗ってやるか、と、オイル交換のついでにオートバックスに向かう。

  しかし、店にてワイパーブレードの適合情報を確認すると、運転席側のみ「SH-1」なるヘンなアダプタが必要らしい。なんで? 改めて、駐車場に戻りSVXのブレードの現物を確認すると、ちょっとした突起(矢印部分)が出ていることに気づいた。アダプタが必要な原因が、このせいだかどうだかわからんが、それなら助手席側も必要なはずである。どうにも気になって、結局、買わずに帰ってきた。そもそも、リアに対応品がないのも気分が悪い。

  画像の説明 画像の説明

  で、どうせ、アームを塗るんだから、ブレードも塗っちまえ、と、サビに軽くサンドペーパーをかけて、手持ちのプラモデル用塗料のつや消しブラックをシューシュー吹いてみる。風が弱まるのを待っては、直近からシュー、の繰り返し。極めて雑な作業である。しかし、つや消しブラックほど、雑に塗ってもアラの目立たない塗料もないからね。

  画像の説明 画像の説明

  完成。極めて雑な作業であったが、かなりの効果である。サビがあったなんて、ぜんぜんわからない仕上がりだ。満足。で、改めて「突起が乗り上げる」という状況を子細に確認したところ、乗り上げた状態では、ワイパーゴムの密着が完全に回避されている、ということに気づいた。元が高価な車だけあって、こういうところにも専用部品を利用し、凝った作りになっているんだなぁ(それで、一般的な部品が使えないことは善し悪しだけど……)、と再認識。

  画像の説明 画像の説明

  後で調べたら、ワイパーブレードの適合情報に「リフター解除時のみ適用可」なんていう備考があることに気づいた。おいおいッ!! せっかくある機能を殺して使うコトが前提ってコトかよッ!! そんなの「非適合」って書くべきじゃないのか。そんなの明記したら、売れるものも売れなくなるかもしれんが、メーカーとしての良心を疑うなぁ。もう、オマエのところでは、替えゴムは買わん。

  しかし、どうせ塗るなら、金色とかに塗るのも面白かったかもしれんなぁ、と思いつつ、あまり耐久性を考えないで処置をしてしまった自分にジレンマを感じる。どうしても、耐久性を考えないで処置をした、ことを、そんなに長く乗るつもりはない、ことと心の中で結びつけてしまう。いや、そんなつもりはないんだけどさ……いろいろあったしなぁ。走行距離はまだ84,000km弱なんだけど。

  その後、ホームセンタに行ったら、車を降りたイッペイが、車の後側面をシゲシゲと眺め「ここにRedSunsのステッカー貼ったらカッコいいじゃん」と発言。トオチャン的には「ナイス」だったが、カミさんに即座に却下された。

  とはいえ、着実に「イイ子」に育っていると感じた今日この頃である。



2011-05-20(Fri) チープに歌うLinux「妖音リナ」

  先日、思わせぶりなことを書いたが、なんでいきなり昔作ったDTMアプリを引っ張り出してきたかというと、Linux上でOSSだけを組み合わせて「歌わせてみた」いから、そのための前哨戦だったワケだったりする。

  なんだかんだいって、以前に作曲のマネゴトをしてたワケだし、いまこの瞬間も「初音ミク」には手を出す寸前なのだ。ただ、Windows上でGUIでってのが、オイラにとってはかなり敷居が高い。Linux用のボーカロイドが欲しい。が、ない。んじゃ、作る。

  画像の説明

  「発声」には、以前も使ったfestivalをそのまま使う。例えば「あ」を発声するには以下のようにする。

echo 'ah' | text2wave -o ah.wav; play ah.wav

  しかしfestivalはスピーチエンジンなので「音程」がない。音程を生成するためsoxを使う。

echo "ah" | text2wave | sox -t wav - ah_200.wav pitch 200

  歌の構成要素は、発声、音程と、リズムである。最後のリズムもsoxを使い、任意のタイミングでwavを重ねることで行う。

sox -M words/word_ka_900.wav "| sox words/word_wa_800.wav -p pad 0.18750" "| sox words/word_shi_900.wav -p pad 0.37500" midi/connect_vocal.wav remix -i; play midi/connect_vocal.wav

  そういえば、以前から「初音ミク」はボーカルだけのソフトなので、他のDTMで作った伴奏と、どうやってミキシングするのかが疑問だった。そもそも、MIDIファイルって、サウンドカードを経由せずにwavファイルかなんかに変換できるものなのか? できないのなら、PCのラインジャックとマイクジャックをつないで録音しなければならない? ……と思ったら、昨日のtimidityでアッサリできるようだ。

timidity -OwS midi/connect.mid -o midi/connect.wav

  そりゃ別に不思議はないわな。MIDIをデコードして、波形を/dev/dspに吐く時点で、wavに近い形式になってるんだから。

  ……っと。以上で必要になる各テクノロジは揃った。

  <暫定稿>

  「チューリップの歌」<mp3を再生する>

  「イッペイのテーマ」<mp3を再生する>

  「コネクト」<mp3を再生する>

  「かえるの歌」<mp3を再生する>

  「かえるの歌x2」<mp3を再生する>

  「かえるの歌x3」<mp3を再生する>


2011-05-25(Wed) UFOを探して

  今日はワケあって休み。

  昼からイッペイを連れて、散歩がてら、近所のUFOを見物に行った。

  画像の説明 

  正体は水道関係の施設。デカい。

  震度7とかで、転がってこネェか心配だ。


2011-05-28(Sat) かんな、始めました


2011-05-29(Sun) 微進捗アレコレ

  MP3プレイヤをほったらかしにしたまま、ちょっと別のプロジェクトを始めてみた。Cで書いてある、自分のスケルトンコードを元にしたら、数十分で踏切りが動き出した。ラクだなぁ。

  で、初めて動画をアップしてみた。