投稿

LEGO Mindstorms IrTower改造

イメージ
IrTower本体からUSBケーブルが伸びているのだが、ケーブルは長く硬かったので取り回しが悪かった。そこでUSBケーブルを着脱可能にしてみた。タワー本体にminiBコネクタを設けることで、汎用USBケーブルを利用可能にした。ノートパソコンを使うので、ケーブルの長さは50cmもあれば十分。この改造によって持ち運びも楽になった。 IrTowerの内部はこんな感じで、元々は基板に直接ケーブルがはんだ付けされていた。ケースは若干削っている。 基板のアップ。3つある青い色のLEDが赤外線LED。白い色のLEDは送受信の際に発光する通常のLED。 自作USB miniBコネクタ基板。この基板をケース内部に固定させた。コネクタは以前、秋月電子で4個200円で買ったもの。 よく使われているminiB。 miniBオスのピアンサイン 5ピンあるけど使っているのは4ピンだけ。 1 VCC 5V 赤 2 -D   白 3 +D   緑 4 GND   黒 コネクタの位置は下のところ。本来ここからケーブルが出ている。 ケーブルを接続するとこんな感じ。 接続部分のアップ。

LEGO Mindstorms RCX1.0 で leJOSでも

イメージ
子供がプログラムを始めたので、随分前に買ったレゴマインドストームRCXを利用することにした。言語はJava。でもマインドストーム用にアレンジされたleJOS(レホス)というもので、コンパクトで扱いやすい環境。 マインドストームにはグラフィカルなプログラム環境も提供されているが、あまりプログラムの勉強にならないような気がしたので、いきなりleJOSを使うことにした。ちょっと難しいかなと思ったが、意外と抵抗なくスラスラとアルゴリズムを考え出したので心配は無用だった。このBlogには、何をやったのかを備忘録程度に残しておこうと思う。 マインドストームとは? マインドストームとはレゴ社が開発したレゴブロックを基本に、マイコン、モータ、センサー等がセットになったシステム。パソコンでプログラミングすることでロボットなどを自作することがでる。レゴブロックの特徴であるパーツの自由な組合わせと、プログラミングのコンビネーションは、おもちゃとしての領域を超えて、2000年ぐらいから教育現場を中心に教材としても広く使われるようになった。マインドストームは現在NXT(2006年発売)というシリーズへ移行。ここで扱うのは1998年に発売された初代のRCX。もう生産終了しているモデルで、現在のNXTとはハードもソフトも大きく違っていて、互換性はない。 RCXの主な仕様 CPU: 8bitマイクロプロセッサH8/3292 16MHz(日立→ルネサス エレクトロニクス) メモリ:  ROM 16kbyte CPU内蔵(0x0000~0x3fff) (512BのオンボードRAM) RAM 32kbyte 外部RAM(0x8000~0xffff) (ファームウェアとユーザプログラムを入れる) インターフェース:  センサ制御ポート(input port)×3 モータ制御ポート(output port)×3 赤外線通信ポート×1 LCD 5文字(7セグ) ボタンスイッチ×4 サウンド制御 (ビープ音) インターバルタイマー 電源 乾電池 単3形 ×6本(9V) AC 9~12V (交流を入れる仕様 日本ではあまりお目にかからない) IrTower パソコンとRCXの赤外線通信に使う重要なアイテム。 マインドストームRCXをJ

音程差から周波数計算 JavaScript

音程差から周波数を計算するプログラム。使い方としては基準音のAの音に対して音程差を入力すると周波数を計算する。基準音なら「0」、半音上なら「1」、オクターブ上なら「12」、オクターブ下なら「-12」という具合。さらに、「1.5」とか1/4音も計算できます。 Calib. A: Hz Interval: Half Step Frequency: Hz スクリプトはこんな感じ。 <HTML> <HEAD> <TITLE>frequency calculate</TITLE> <script type="text/javascript"> <!-- function calcF(){ goukei=0; var num1= document.formF01.elements[0].value; var num2= document.formF01.elements[1].value; var num3= num1*Math.pow(2,(num2/12)); document.formF01.hz01.value=num3; } //--> </script> </HEAD> <BODY> <form name="formF01"> Calib. A <input type="text" value="440">Hz<br> Interval <input type="text" value="0"><br> <input type="button" value="calculate" onClick="calcF()"><br> Frequency <input type="text"name="hz01">Hz<br> </BODY> </HT

Java Applet WaveViewer (波形表示アプレット) を作ってみた

イメージ
上画像はイメージで下は動作可能なアプレットになります。 このアプレットを動かすためには、Javaの環境設定をいじる必要がある。java.policyファイルにオーディオを許可する内容を書き込むとマイク入力が許可され、波形が表示されるようになる。 WindowsXPだと、このファイルに、 C:\Program Files\Java\jre6\lib\security\java.policy 下の1行を加える。 permission javax.sound.sampled.AudioPermission "record"; たぶんこれで動作する。 プログラムの概要 チューナーを作るための下準備として波形を表示させるプログラムを作ってみた。マイク入力から音を取得して、それを表示させている。幅は44Hzぐらいを表示。音叉の440Hzを入れると10周期ぐらいが表示される。個人的に波形ひとつひとつを見たかったので、これぐらいにしてみた。動きはぎこちないが、まぁ目標は達成できた。 作ってみて いつものように資料はAPIぐらい。動けばよいというレベル。やってみてわかったことは、意外とCPU負荷が高いということ。次から次へと来る音の信号を、一つ一つ処理することはパソコンでも結構辛いようだ。はじめ44100Hzのサンプリング周波数で入れてみたが、CPU負荷が高すぎたので、サンプリング周波数を10000Hzまで落としてみた。音の入力レベルに関しても8bitに下げている。 内部的にはbyteデータをリングバッファに溜めつつ捨てつつ、一定時間ごとに表示させている。やっていることはシンプルなのだが、連続的に行うので、いかに軽く作るかがポイント。リアルタイム処理って難しい。

Javaでギター用チューナーでも作ろうか

イメージ
昨年末からプログラムをやっていないので、忘れないために2ヶ月ぶりに再開してみる。今回はギター用チューナーでも作ろうかと思うが、毎回のように予備知識なしなので、適当に考えて、それを実現させようかと思う。 まずはギターの音を録音して波形を見てみた。サンプリング周波数は44100Hzで録音してみた。赤字の周波数が各弦のジャストチューニング。その横はジャストのときのサンプリング数。その下はジャスト前後のサンプル数と周波数。 1弦 329.62756Hz (133.7874sample) 134sample(329.1045Hz) - 133sample(331.5789Hz) 2弦 246.94165Hz (178.5847sample) 179sample(246.3687Hz) - 178sample(247.7528Hz) 3弦 195.99772Hz (225.0026sample) 226sample(195.133Hz) - 225sample(196.000Hz) 4弦 146.83238Hz (300.3425sample) 301sample(146.512Hz) - 300sample(147Hz) 5弦 110.00000Hz (400.9091sample) 401sample(109.975Hz) - 400sample(110.250Hz) 6弦   82.40689Hz (535.1494sample) 536sample(82.2761Hz) - 535sample(82.430Hz) 波形のかたち 思ったよりも素直だ。倍音が結構含まれているから、もっとギザギザかと思ったけど、そうでもなかった。6弦だけがちょっと倍音が多いけど。 周波数とサンプリング数の関係 上記のように何サンプルでジャストチューニングになるのかを計算したら結構中途半端になった。精度を上げるためにはちょっと細工が必要かもしれない。主流のサンプリング周波数はいくつかあって、44100Hz、48000Hz、96000Hzなどが一般的で高音質な部類になると思う。そこで思ったのだがCDのサンプリング周波数である44100Hzって昔から中途半端な印象があって不思議に思っ

音叉でチューニング

イメージ
ギターのチューニングは音叉で行っているのだが、チューニング手順はいろいろあるようだ。一般的な方法としては、ギターの5弦開放を音叉で合わせた後、5弦と6弦、5弦と4弦、4弦と3弦を5フレットと開放やハーモニックスを使って合わせていく。1、2弦はいろいろな方法があるようだが、ひとつは6弦と1弦を合わせて、最後に1弦と2弦を合わせて完了。これは5弦を中心としたチューニングとも言える。 使用している音叉 Wittner 921 ウイットナー(ドイツ) ギターを始めたときは、上記のようなやり方で合わせていたが、5弦のみを基準にするので、どこかで調整が甘いと、その先ズレまくるという欠点がある。またハーモニックスもオクターブの関係にある2倍音(12フレットナチュラルハーモニックス)、4倍音(5フレットナチュラルハーモニックス)なら問題ないが、3倍音(7フレットナチュラルハーモニックス)では平均律ではなく、純正律で2セント高くなってしまう。またハーモニックスはオクターブチューニングや弦の太さにも影響を受けるため、あまり信用できない。 下はAと5度上のEのハーモニー。上段が平均律で緩やかなうなりがある。下段が純正律でうなりがない。 ギターで3倍音のハーモニーを使ってチューニングすると僅かながらズレてしまうことが分かる。 上段平均律 A220Hz E329.6275569128699Hz 下段純正律 A220Hz E330Hz そこでなるべく音叉で各弦をチューニングする方法に変更した。具体的なやり方はこんな感じ。 独自の音叉によるチューニング方法 5弦 5フレット上のナチュラルハーモニックスと 音叉  440Hz 3弦 2フレット(14フレットナチュラルハーモニックス) と 音叉  440Hz 1弦 5フレット と 音叉  440Hz 4弦 開放 と 5弦5フレット 2弦 開放 と 3弦4フレット 6弦 5フレット上のナチュラルハーモニックス と 1弦開放 こんな感じで5、3、1弦は音叉とあわせている。残りの弦は隣の音叉で合わせた弦や、オクターブ関係にある弦に合わせるので、ズレは生じにくくなっている。しかし、オクターブチューニングなどがしっかり出来ていないと、かえってまずい結果になるとも言える

マイクケーブル工作
CANARE L-4E6S, XLR(NEUTRIK NC3FXX-B/NC3MXX-B)

イメージ
セットを買うより安価だったので自作してみた。自作と言ってもケーブルとコネクタを買ってきて、はんだ付けするだけ。購入先はサウンドハウス。 CANARE L-4E6S 1m当たり110円 定番マイクケーブル。信頼性が高く安価。特長は以下の通り。 曲がりぐせがつきにくく、ステージ・報道など中継用。 編組密度94%以上の高密度編組シールドで電磁波ノイズを防ぐ 導体は0.08mmの極細線を1心あたり40本使用した撚線構造で、耐久性に優れている。 CANARE L-4E6S 仕様 直径 6mm 線心数 4本 導体断面積(AWG) 0.20mm (24) 導体構成 40本(0.08mm) よりピッチ 20mm シールド(編組)密度 94%以上 電気特性 心線 9.8Ω/100m シールド 3.0Ω/100m 線間静電容量 心-心 150pF/m 心-シールド 185pF/m 心線の抵抗値は9.8Ω/100mだが、ひとつの信号に対して2本使いなので、実際には4.9Ω/100mで使用することになる。 ちなみに銅線1本0.08mm当たりの抵抗値は392Ω/100mとなる。 静電容量は、電気をためる値で、コンデンサーと同じ原理。数値が大きいほどハイパスフィルターとなって高周波がグランドへ流れてしまうので、この値は小さい方が望ましい。ただし、音声で扱う周波数はそれほど高くないので、音質に影響が出るとは思えない。 同じカナレで、L-2T2Sという2芯のマイクケーブルがあるが、静電容量が心-心70pF/m,心-シールド106pF/mと若干小さい。スペックからするとこちらの方が高性能となるが、L-4E6Sと聞き比べて判るとは思えない。 XLRコネクタ NEUTRIK NC3FXX-B 310円 NEUTRIK NC3MXX-B 290円 XLRコネクタは、ITT社がオリジナルだが、現在は数社から販売されている。NEUTRIK社は安価でITTよりもよいという話もあったので買ってみた。 NEUTRIK NC3FXX-B (Female) 大きく分けて4つのパーツで構成されている。2パーツはNC3MXX-Bと共通のようだ。リングは取れる。 NEUTRIK NC3MXX-B

Javaクロマチック アコーディオン ソフト鍵盤 3

JavaAppletのソフト鍵盤。JIS配列のキーボードに対応しています。マウスクリックしても音は鳴りません。一度Applyボタンをクリックすると有効になります。 Chromatic Accordion Java Applet Applet failed to run. No Java Plug-in was found. 参考までの音色リスト Windows標準MIDI音源はGM音源。Java純正もGM音源で、音色と番号は互換性がある。上記のソフトはGM規格の番号に対して-1で表示。プログラム的には-1なので、そのままにしてます。GMの詳細については こちら を参照してください。 0~7  ピアノ  8~15  クロマチックパーカッション 16~23 オルガン  24~31 ギター  32~39 ベース  40~47 ストリングス  48~55 アンサンブル  56~63 ブラス 64~71 リード  72~79 パイプ  80~87 シンセリード  88~95 シンセパッド  96~103 シンセエフェクト  104~112 エスニック  112~119 パーカッシブ  120~127 エフェクト 機能を追加してみた MIDI音源を選べるようにした。コンボ ボックスをクリックするとPCが認識しているデバイス一覧が表示されるので、その中から選択する。MIDIYokeなどのソフトMIDIケーブルを使えば、VSTiソフト音源も扱える。よく分からない人は Microsoft GS Wavetable SW Synth (Windowsの場合)を選択してください。 音色を選べるようにした。手入力でprogと書かれているテキストボックスに0~127までを入力。その後「Apply」ボタンを押すと反映されます。 Octave: 音域を広げてみた。右へ行くほど高くなる。通常の楽器の音域をほぼカバー。 Velocity: キーを押したときの音量を5段階で調整。右へ行くほど音が大きくなる。 プログラミングについて ソフト鍵盤でも、クロマチックアコーディオンの配列は意外と弾けそうだと思えたので、VSTiを扱えるように機能を追加した。今回MIDIの仕様を少し調べてプログラムに反映させてみ

Javaでクロマチックアコーディオンのソフト鍵盤 2

イメージ
Chromatic Accordion Java Applet 上記アプレットはダミーです。最新のアプレットは こっち のページで公開してます。 クロマチックアコーディオンのJava Appletです。とりあえず動くところまで作ってみたのでアップしてみた。アプレット内を一度クリックすると、PCキーボードのキーを押すたびに音が出る。 JIS配列のキーボードを想定。位置は押して確認してみて。 キーボード入力のみ。マウスクリックでは音は出ない。 音色はPCのデフォルトMIDI音源でアコーディオン固定。 オクターブ変更はボタンをクリックすると1オクターブ上がる。 問題点 起動直後はもたつく。 あまりガンガン弾くと、音が鳴りっぱなしになってアプレットがフリーズするときもあるので注意。そういうときはブラウザを再起動してください。 Linuxだとキーイベントがうまく取れずに、音がちゃんと出ない可能性大(未確認)。 音がやや遅れて出る。ゆっくり弾く分にはそれほど問題はない。 キーボードのハード仕様によって、同時に押せるキーの組合わせに制限がある場合がある。USB接続のキーボードの場合は同時発音数は6音まで。 意外と弾けるかも ちゃんと練習すればパソコンのキーボードでも、そこそこ弾けそうな予感。ピアノ配列よりも相性がよいと思えた。 プログラミングについて 知識もないまま無理やり作ったアプレット。参考になりそうなサンプルもなかったので、API仕様を読みながらひとつずつ組み上げたかんじ。かなり混沌としたソースになってしまった。 苦労した部分。まずキーを押している間だけ音を出すというところ。パソコンのキーボードは押し続けると、「rrrrrrrrrr」のように連続して押していると認識してしまう。MIDIでこの情報をそのまま送ると、同じ音がガンガン重なってしまう。この解決方法としては、音が出ているかどうかフラグを立てることで認識させて、一度音を出したら、その音は出さないようにした。当たり前の方法なのかもしれないがプログラムとして機能させるまで時間がかかった。 GUI関連はやっぱり面倒くさい。ソースが長くなるのはGUIやグラフィックがあるから。グラフィックなしなら1/3ぐらいの時間で完成すると思う。発音した音をグラフィックに

Javaでクロマチックアコーディオンのソフト鍵盤1

イメージ
思いつきでクロマチックアコーディオンのソフト鍵盤を作ってみようかと思う。すっかりJavaを忘れてしまったので、リハビリという感じ。 クロマチックアコーディオンのキー配列 そもそも、ソフト鍵盤を使ってみようかと思ったら、あまりにも使いにくかったので、パソコンのキーボードで無理なく弾ける入力方法を考えていたら、ボタンがたくさんあるアコーディオンを思い出した。あれってどういう仕組みなのだろうか? 今の時代ネットで検索すればいくらでも出てくる。ローランドのサイトでキー配列を調べた。 http://www.roland.co.jp/VA/index.html 右手側のキー配列は、横には短3度で、右斜め上&左斜め下は半音、左斜め上&右斜め下は1音で5段。キーがレンガ状に配置されているので、パソコンのキーボードに近いものを感じる。これはピアノ鍵盤よりも相性はよさそうだと勝手に判断。それに同じ種類のコードはフォームが変わらないという、ギターと似たような構造が気に入った。 プログラミングスタート といういことでプログラムにとりかかる。Javaで数時間で完成するかと思ったら甘かった。いろいろ知識が不足していた。それに半年前に覚えたこともすっかり忘れてしまった・・・ 仕様としてはクロマチックアコーディオンの5段は実現できないので4段に縮小。横もオリジナルよりは少ないが、ピアノソフト鍵盤よりも音域は広く使える。また、キーの多いJIS配列が、初めてありがたいと思えた。音域がそれなりに稼げるので。 MIDI関係 音は簡単そうなパソコンのMIDI音源を利用しようと思う。まずJavaのMIDI関連のAPI仕様を読むが、さっぱり意味が分からなかった・・・。そもそも他では通用しない専門用語を、他では通用しない専門用語で説明されても分からない・・・ 分からないまま、適当にいじっていたら何とか音が出た。が、実現しようとしてるキーボード入力から音を出すということではまった。というか音を消すほうではまった。GUIのボタンから音を出すほうは、まだマシだったが、完成はしていない。 さらにテストしていてキーボードのハードの問題にもぶつかった。ThinkPad X61を使っているのだが、キーを同時に押すと、ある組合わせによってビープ音が出て入力を拒絶され