create every day - 福野泰介の一日一創

ファミコンMIDI音源「ふぁみみみっでぃ」音声出力簡単改造 x IchigoJam

2017/09/23 23:55:00
#IchigoJam #midi #maker 

コミケC92で入手したファミコンをMIDI音源にしてしまうカセット「ふぁみみみっでぃ by @hekekekun」をちょっとだけ改造してIchigoJamに接続。


起動音がかわいい、ふぁみみみっでぃ、IchigoJamでいろいろ鳴らしてみるプログラムがこちら。普通のMIDI音源として使えます。

10 UART0:BPS31250:V=127 20 FOR I=30 TO 100 30 C=#90:GSB100 40 C=#93:GSB100 50 IF BTN() END 60 NEXT 70 GOTO 10 100 UART1:?CHR$(C,I,V);:WAIT10:?CHR$(C,I,0);:UART0:RTN

普通のファミコンの場合、音声出力がRF(アンテナ)なので、AV改造などが必要でしたが、カセットの仕様を見ると音声がカセット端子にでています(45ピン)。 これを使って鳴らしてみた今回ですが、ちょっとノイズがひどいのでもうちょっと解析と対策が必要な様子。

ふぁみみみっでぃのBACK側、真ん中あたりの青い線がSOUND INにあたる45ピン。 ついでに、VCCにIchigoJamからの5Vをつなぐので、ファミコンのACアダプターもいらなくなってコンパクト!

links
- ファミコン実機とMIDI連携できるカセット「ふぁみみみっでぃ」のご紹介!MIDINES欲しかった人は要チェックです! | ハイレゾスタイル
- へけけくん (@hekekekun) | Twitter (ふぁみみみっでぃの作者さんのTwitter)
- 極楽ほんげら (ふぁみみみっでぃの作者さんのサイト)
- IchigoJam BASIC 15行、バンブラ奏法で奏でるMIDI楽器

セグメントを2つ減らして消費電力3割減、5セグメントLED時計風アプリ

2017/09/22 23:55:00
#js #maker 

IchigoJam webでPCブラウザ上のフルスクリーンという技を覚えたので、プロジェクターなどの大画面に映える時計アプリを作ってみました。 ビジュアルで魅せるアプリづくりのテンプレートとしても活用ください。

選んだのは、一日一創2012の中でもお気に入り成果のひとつ、5セグメントディスプレイを使った時計「my5segclk
ゼビ文字に似せたことでちょっとが読みにくかったので、0と4を変更。


1 2 3 4 5
6 7 8 9 0 、と読みます。

エレベーターなどでおなじみ7セグメントLEDとくらべて2セグメント少ないので、消費電力28%減!(単純計算)
一味違った雰囲気で時を伝えます。


fivesegclk」 大きさ色をカスタマイズ可、表示部分クリックでフルスクリーン化

links
- 一日一創 - 時計アプリ
- 【IchigoJam】5セグメントLED - 2017-09-24 - SHIROのモバイル日記 (角型LEDで実現!)
- http://scientific601.altervista.org/5segment.html 1973年に考えられた5セグディスプレイ
- 道新スタッフブログ: いまだ現役!41年前のシャープ製電卓 - 7セグに固まる前は8セグ?

IchigoJamでも光る大五郎! 300コのフルカラーLEDを簡単コントロール! IchigoJam x WS2812B/SK6812/NeoPixel

2017/09/12 23:55:00
#IchigoJam #maker 

ギャル電さんの「光る大五郎」やキラキラウェアラブルを創りたい?
1つ数十円で買えるコンピューター内蔵フルカラーLED、WS2812B。
IchigoJamへダイレクト接続、超簡単にコントロールできます。


10x10、100コ並んだSK6812(WS2812B+ホワイトLED)や、テープ状に300コ連なったWS2812Bや、8コのスティック状WS2812Bの制御実験の様子です。

LEDがいくつあっても接続電源に信号線1本だけというシンプルな配線。

IchigoJam - WS2812B
VCC - 5V
OUT1 - DIN (DOUT - 次のDIN...)
GND - GND

DIN端子に、0/1をパルスの長さで表し、GBB(SK6812ではGRBW)の順に8bitずつ上位からまとめて送ると、フルカラーLEDに内蔵されているマイコンが、先頭の自分の分のデータを抜き取りDOUTから出力。数珠つなぎにしたLEDをまとめて自在にコントロールできます!

WS2812Bの電源は3.5V〜5.5V。ちょっと足りませんが、IchigoJamの3.3V(VCC)でも一応動きました。電源を5Vを使い、3.3Vの信号のまま変換なしでも動いてくれましたが、ちゃんと作るときにはWS2812Bなど仕様書をチェック!

パルスは300nsec(ナノ秒)単位なので、ARMマシン語入門その10と同様、マシン語のループを使って時間調整しつつOUT1を制御するプログラム(ソースコードは末尾)を打ち込んで、早速実験!

10 POKE#700,240,181,114,182,64,24,80,33,9,2,1,49,9,4,4,136,1,48,128,37,1,48,3,120,255,34,74,96,3,39,10,38,43,66,1,208,10,39,3,38 20 POKE#728,1,63,253,209,0,34,74,96,1,62,253,209,109,8,239,209,1,60,234,209,98,182,240,189 RUN

まずは、WS2812B、1つを点灯してみましょう。
赤(明るさ4、最大255です)

POKE#800,3,0,0,4,0:IF USR(#700,#800)

POKE#800,3,0,4,0,0:IF USR(#700,#800)

POKE#800,3,0,0,0,4:IF USR(#700,#800)

先頭2byteで送信するデータサイズをリトルエンディアンで指定します。
3つのLEDを使って、緑、黄、赤の信号色に光らせる時はこんな感じです。(明るさ8)

POKE#800,9,0,8,0,0,8,8,0,0,8,0:IF USR(#700,#800)


(WS2812B、SK6812、NeoPixelで検索するといろいろ楽しい照明が見つかります!)

マシン語へデータを受け渡し用に#800の変数領域を使っていますが、画面用メモリ(VRAM)を使ってもOKです。

POKE#900,9,0,10,0,0,10,10,0,0,10,0:IF USR(#700,#900)

NコのLEDをランダムな全部同じ色で光らせる場合はCOPYコマンドをつかいます。(102コの配列の204byteなので68コ以上制御しようとすると変数が壊れてしまうので注意!)

N=8:M=4:POKE#800,N*8,0,RND(M),RND(M),RND(M):COPY#805,#802,N*3-3:IF USR(#700,#800)

Nコの全部、ランダム色(N<=67)

200 N=8:M=4:POKE#800,N*3,N*3>>8 210 FOR I=0 TO N*3-1:POKE#802+I,RND(M):NEXT 220 U=USR(#700,#800) 230 GOTO 210 GOTO200

ランダム色をスクロール(N<=67)

300 N=8:M=4:POKE#800,N*3,N*3>>8 310 COPY#802+N*3-1,#802+N*3-4,-N*3+3 320 POKE#802,RND(M),RND(M),RND(M) 330 IF USR(#700,#800) 335 WAIT5 340 GOTO310 GOTO300

300コで3,280円(1コ11円)!300コのテープ状LEDを制御するには、300*3+2の902byte必要になります。 VRAM領域768byteだけでは足りないので、#800からの変数領域も使います。ただし、変数が破壊されてしまうので、直接数で指定した「ランダム色をスクロール」300コ対応版です。

300 POKE#800,300*3,300*3>>8 310 COPY#802+300*3-1,#802+300*3-4,-300*3+3 320 POKE#802,RND(3),RND(3),RND(3) 330 IF USR(#700,#800) 335 WAIT5 340 GOTO310 GOTO300


WS2812Bが8コついたスティック状

応用編、8コをランダムな色でゆっくりつけたり消したり

100 N=8:M=16:POKE#900,N*3,N*3>>8 110 R=RND(M):G=RND(M):B=RND(M) 120 FOR I=0 TO 19 125 L=I:IF I>10 L=19-I 130 FOR J=0 TO N-1 135 P=N-J 140 POKE#902+J*3,G*L*P/80,R*L*P/80,B*L*P/80 150 NEXT 160 IF USR(#700,#900) 170 NEXT 180 GOTO 110 GOTO100


10x10、100コのフルカラーLED(SK6812)でなんと1,440円!?(1コ14円)
好きなように切ってつないでも使えるSK6812を10x10のマトリクスLEDにしてみました。


5V/GND/信号線をはんだづけしていきます

SK6812は、WS2812Bに加えて白色LEDが増えて入る分、1つあたり4byte使って制御します。
4byte目を使って白く光らせる。

POKE#800,4,0,0,0,0,10

100コのランダム色がスクロール RGBW版

500 N=100:M=4:POKE#800,N*4,N*4>>8 510 COPY#802+N*4-1,#802+N*4-5,-N*4+4 520 POKE#802,RND(M),RND(M),RND(M),0 530 IF USR(#700,#800) 535 WAIT5 540 GOTO500 GOTO500

応用編、文字表示 for 10x10 SK6812

10 S="IchigoJam" 20 FOR I=0 TO LEN(S)-1 25 P=#900:POKEP,400,400>>8:P=P+2 26 R=RND(2):G=RND(2):B=RND(2) 27 FORJ=0TO9:POKEP,G,R,B,0:P=P+4:NEXT 30 C=ASC(S+I) 40 FOR J=0 TO 7 45 POKEP,G,R,B,0:P=P+4 50 FOR K=0 TO 7 70 N=PEEK(C*8+J)>>(7-K)&1 75 POKEP,G,R,B,N*8:P=P+4 80 NEXT 85 POKEP,G,R,B,0:P=P+4 90 NEXT 91 FORJ=0TO9:POKEP,G,R,B,0:P=P+4:NEXT 92 IF USR(#700,#900) 95 NEXT 96 GOTO20


文字をランダムな背景色と合わせて表示

ド派手な電子工作から硬派な電車風電光掲示、ほんわかステキな演出など、手軽に作れちゃいますね!

アセンブラ「asm15」でコンパイルできる、WS2812用マシン語のソースコードはこちらです。

' OUT1 WS2812B DOUT [R1+`0001]を変更でOUTnに変更可能 ' R0 - 開始アドレス 送信byte数low,送信byte数high,G1,R1,B1,G2,R2,B2 .... ' R1 - base address (初期はRAM offset) ' R2 - OUT value 0/#FF ' R3 - data value ' R4 - data count ' R5 - bit count ' R6 - wait count buf ' R7 - wait count @WS2812B PUSH {LR,R4,R5,R6,R7} CPSID R0=R0+R1 R1=#50 'R1=#50010000 GPIO1 R1=R1<<8 R1+=1 R1=R1<<16 R4=[R0]W R0+=1 @LOOP_DATA R5=#80 R0+=1 R3=[R0] @LOOP_BIT R2=#FF [R1+`0001]L=R2 R7=3 '(3*4+1)=13 <- 16.8+-7.2 R6=10 '(10*4+1)=41 <- 43.2+-7.2 R3&R5 IF 0 GOTO @SKIP R7=10 '(10*4+1)=41 <- 43.2+-7.2 R6=3 '(3*4+1)=13 <- 16.8+-7.2 @SKIP R7-=1 'wait R7*4+1 clock IF !0 GOTO -1 R2=0 [R1+`0001]L=R2 R6-=1 'wait R6*4+1 clock IF !0 GOTO -1 R5=R5>>1 IF !0 GOTO @LOOP_BIT R4-=1 '+6clock IF !0 GOTO @LOOP_DATA CPSIE POP {PC,R4,R5,R6,R7}

SK6812用にウェイト調整しなくても動きました。仕様に合わせて高速化したい場合、R6/R7のウェイトを調整しよう!
* ウェイトをインライン展開して、8byte削減!(72byte→64byte)

links
- マシン語を制すもの時間を制す「DMX512事例」 / IchigoJamでまなぶARMマシン語入門その10
- yhironaka/IchigoLamp: シリアルLED WS2812B をLPC810を使ってIchigoJamから光らせるっ!

マシン語を制すもの時間を制す「DMX512事例」 / IchigoJamでまなぶARMマシン語入門その10

2017/09/07 23:55:00
#DMX #maker #IchigoJam 

マシン語の気持ちいいところは、実行時間が正確に読めるところ。
割り込みを止めて、各命令の所要クロック数を数えることで、さまざまなデバイスとつながります。

一応動いた「DMX512対応の照明」仕様書とちょっと違った動きの謎は、オシロスコープで解けました。

照明業界の標準規格「DMX512」は、250kbpsの差動信号によるシリアル通信で、25byte〜513byteまでを一塊にデータを送る仕様です。(ケーブル加工方法
塊の始まりを示す信号などに特徴があり、stopbitもIchigoJamの標準1bitと異なるので、IchigoJamのシリアル通信を使わず、OUT1とOUT2ポートで制御することにします。

とはいっても、250kbpsとは、1bitを4μ秒で表現となかなかに高速なため、IchigoJam BASICでは追いつきませんし、C言語では細かい時間が合わせができません。 そこで登場、マシン語です!

1命令、約21nsec(21ナノ秒=1/48MHz)で動くIchigoJamのARMマシン語なら、この1bitの送信時間内に192クロック分使えるので、十分に対応できそうです。

まずはループを使って正確に待つプログラムをつくります。

@WAIT R0-=1 IF !0 GOTO @WAIT RET

ARMマシン語表を見て、必要クロック数を計算します。
R0-=1 は 1
IF !0 はジャンプする時 3、しない時 1
RET は 3
ということで、R0が1のときは5クロック、2で9、3で13・・・R0*4+1クロック分、待ちます。
R0に30000を指定すると、1/48000000*(30000*4+1)*1000=2.5m(秒)
R0に183を16bit左シフトした値で、約1秒となります。

R0=R0<<16 @WAIT R0-=1 IF !0 GOTO @WAIT RET

これをマシン語に変換して、TICKで測ってみましょう

[0]=`00000 10000 000 000 :'r0=r0<<16 [1]=`00111 000 00000001 :'r0-=1 [2]=`11010001 11111101 :'if!0goto@wait [3]=`01000111 01110000 :'ret CLT:U=USR(#800,183):?TICK() 126

おや、1秒=60のはずが2秒ちょっとかかってしまいました。
実はこの差は割り込みから来ます。IchigoJamは常時、画面出力処理を割り込み処理によって行っているので、その分遅くなってしまうわけです。

VIDEO0:CLT:U=USR(#800,183):?TICK():VIDEO1 69

だいぶ1秒に近づきました。ただ実はまだフルスピードではないのです。TICK()の値すすめるために内部でのカウントや、キーボードの割り込みなどが残っています。 完全に割り込み処理を止めるマシン語、CPSID(割込禁止)とCPSIE(割込許可)を使います。

CPSID R0=R0<<16 @WAIT R0-=1 IF !0 GOTO @WAIT CPSIE RET

アセンブル

[0]=`1011011001110010 :'CPSID [1]=`00000 10000 000 000 :'r0=r0<<16 [2]=`00111 000 00000001 :'r0-=1 [3]=`11010001 11111101 :'if!0goto@wait [4]=`1011011001100010 :'CPSIE [5]=`01000111 01110000 :'ret CLT:U=USR(#800,183):?TICK() 0

画面出力が一旦途切れて、1秒後戻ってきましたか?
TICK()の数値が0になるのは、割り込み処理が完全に止まっていた証拠です。

正確に待ち時間をコントロールすることができるようになったので、DMX512制御プログラムを作ってみます。
制御コードと24ch〜512chのデータを1byteずつ送るので、送るチャンネル数の半分を先頭に指定し、制御コード、チャンネルデータと指定することにして、マシン語プログラムを作ります。

' R0 - 開始アドレス 送信数/2、送信コード(0)、ch1、ch2・・・送信個数分 ' R1 - base address (初期はRAM offset) ' R2 - OUT value (初期はROM offset) R2=1(on) R2=2(off) ' R3 - DMX value ' R4 - loop1 ' R5 - loop2 ' R6 - #100 ' R7 - loopwait @DMX512 PUSH {LR,R4,R5,R6,R7} CPSID R0=R0+R1 R1=#50 'R1=#50010000 GPIO1 R1=R1<<8 R1+=1 R1=R1<<16 R6=#80 R6=R6<<1 R2=2 [R1+`11]L=R2 R7=4 'wait 22*192clock R7=R7<<8 R7+=29 CALL @WAIT R2=1 [R1+`11]L=R2 R7=93 CALL @WAIT R4=[R0] R4=R4<<1 R4+=1 R0+=1 @LOOP2 R2=2 [R1+`11]L=R2 R7=45 CALL @WAIT R5=1 R3=[R0] @LOOP3 R2=2 R3&R5 IF 0 GOTO @SKIP R2=1 @SKIP [R1+`11]L=R2 R7=44 CALL @WAIT R5=R5<<1 R5-R6 IF !0 GOTO @LOOP3 R2=1 [R1+`11]L=R2 R7=93 CALL @WAIT R0+=1 R4-=1 IF !0 GOTO @LOOP2 CPSIE POP {PC,R4,R5,R6,R7} @WAIT R7-=1 IF !0 GOTO @WAIT RET

asm15を使ってアセンブル。
DMX512の端子、1をGND、2をOUT1、3をOUT2へ接続。
初期設定としてOUT1が1、OUT2が0をプログラムに加えてテストします。

10 POKE#700,240,181,114,182,64,24,80,33,9,2,1,49,9,4,128,38,118,0,2,34,202,96,4,39,63,2,29,55,0,240,37,248,1,34,202,96,93,39,0,240 20 POKE#728,32,248,4,120,100,0,1,52,1,48,2,34,202,96,45,39,0,240,23,248,1,37,3,120,2,34,43,66,0,208,1,34,202,96,44,39,0,240,13,248 30 POKE#750,109,0,181,66,244,209,1,34,202,96,93,39,0,240,5,248,1,48,1,60,229,209,98,182,240,189,1,63,253,209,112,71 40 OUT1,1:OUT2,0 RUN OK POKE#800,12,0,255,0,0,255:U=USR(#700,#800) OK

CH1〜4に設定した、DMX512対応の照明「Lixadaステージライト」が青く光ったら成功です!
この照明の仕様は、1byte目に全体的な明るさ(0-127/255)や点滅(128-250)や、2〜4byte目でR/G/Bの明るさを指定するとありました。 チャンネル数は照明によって異なり、ムービングライトの場合X/Y軸の値なども合わせて指定するためチャンネル数は多くなります。

ランダムに原色を混ぜた7色をじわっと光らせ、じわっと消すプログラムはこうなります。

100 R=RND(7)+1:G=R>>1&1:B=R>>2&1:R=R&1 110 FOR I=0 TO #FF STEP 4 120 POKE#800,12,0,255,R*I,G*I,B*I 130 U=USR(#700,#800) 140 NEXT 150 FOR I=#FF TO 0 STEP -4 160 POKE#800,12,0,255,R*I,G*I,B*I 170 U=USR(#700,#800) 180 NEXT 190 GOTO 100

プロトコルのマシン語制御、うまくいかないときに便利、オシロスコープ!
Break信号の長さがちょっと長かったのでおかしかったと判明。WAITするカウントを1減らして修正完了!

信号の反射を防ぐために、ターミーターを作って接続しておくと良さそうです。(2と3を120Ω1/4Wでつなぐ)
DMX512について|サウンドハウス

DMX512に対応したスモークマシンも!
DMXに対応した自作デバイスづくりにもぜひ挑戦してみてください!

links
- 最大512chの照明コントロール!照明界の標準DMX512 x IchigoJam
- DMX512について|サウンドハウス
- "DMX512 照明"で検索 on Amazon

- 連載、IchigoJamではじめる、ARMマシン語入門
1. はじめてのマシン語
2. ハンドアセンブルで超速計算!
3. マシン語メモリアクセスで画面超速表示!
4. マシン語でLEDを光らせよう!
5. 楽しさ広がるマルチバイトメモリアクセスとスタック
6. マシン語使いこなしTIPS
7. カジュアルに使うインラインマシン語
8. アセンブラを使って楽しよう
9. マシン語で高速SPI
10. マシン語を制するもの時間を制す
11. 画面をイチゴで埋め尽くす12の方法

最大512chの照明コントロール!照明界の標準DMX512 x IchigoJam

2017/09/06 23:55:00
#DMX #maker #IchigoJam 

ライブを盛り上げるたくさんの照明。どう制御してるか気になってました。
その答はDMX512という250kbpsの差動信号シリアル通信プロトコルにありました。


IchigoJamで照明を自由自在に操れました!


DMX512に対応した照明、一番安くて2,000円ほど!("DMX512 照明"で検索 on Amazon
XLRケーブルという3ピンのケーブルをデイジーチェーン(数珠つなぎ)で使います。
IchigoJamと接続用にXLRソケットを準備しましょう。


3ピンなので工作は簡単、1がGND、2が+、3が-(2の反転信号)です。


照明2つをIchigoJamから原色を使った7色をキラキラ切り替えるデモ

1 'DMX512 TEST 10 POKE#700,240,181,114,182,64,24,80,33,9,2,1,49,9,4,128,38,118,0,2,34,202,96,4,39,63,2,29,55,0,240,35,248,1,34,202,96,93,39,0,240 20 POKE#728,30,248,4,120,1,48,2,34,202,96,45,39,0,240,23,248,1,37,3,120,2,34,43,66,0,208,1,34,202,96,44,39,0,240,13,248,109,0,181,66 30 POKE#750,244,209,1,34,202,96,93,39,0,240,5,248,1,48,1,60,229,209,98,182,240,189,1,63,253,209,112,71 40 OUT1,1:OUT2,0 100 POKE#800,12,0 110 FOR I=0 TO 1 120 R=RND(7)+1:POKE#802+I*4,255,R&1*#FF,R>>1&1*#Ff,R>>2*#FF 130 NEXT 140 U=USR(#700,#800) 150 WAIT30 160 GOTO110

250kbpsの差動信号を仕様に基づきマシン語化。一応動きましたが、説明書記載とは違うので、どこか間違っていそう。 オシロスコープで確認&デバッグしてから詳しく解説します。(追記、解説記事、上記修正しました)

ふわっち or FAN LIVEなど、誰でもライブが手軽にできる時代。
音楽に合わせてライティングを変えたり、手元のコントローラーで演出したり、ゲームの特殊効果にも使えそう!

コンピューター制御できる照明で、一味違った配信などいかがでしょう?

links
- DMX512-A / Wikipedia
- DMX512 x IchigoJam - 解説記事

シリアル通信で簡単接続!TouchMIDI32 x IchigoJam = BEEPタッチ楽器

2017/09/04 23:55:00
#maker #IchigoJam #sound #midi 

USB-MIDIでWeb MIDIでパソコンに接続してみた、タッチMIDコントローラー「TouchMIDI32
実はシリアル接続してIchigoJam、Arduino、ラズパイなどとも簡単に使えることが判明!


電源を3.3V(5VでもOK、1.71V-5.5V)でとって、TouchMIDI32のシリアル出力(PB8-4)からIchigoJamのRXDにつなぐだけ!

10 BPS31250 20 K=INKEY():IF !K CONT 30 L=INKEY():M=INKEY() 40 ?K,L,M 50 GOTO 20

テストプログラム、MIDIメッセージのTONE ON/OFFが受信できました。
(シリアル通信での0受信は、256となるIchigoJam BASICの仕様です)

早速、次のプログラムを加えてBEEP楽器化してみます!

15 LET[0],240,227,214,202,191,180,170,160,151,143,135,127 43 IF M=127 N=L-60:BEEP[N%12]>>(N/12),15

テストプログラムに15行と43行の2行を加えるだけ!
32音階、2オクターブちょっとあるので、いろいろ弾けそうです


鳴りました! SOUNDとGNDにつないだステレオジャックに、100均スピーカーをつなげています。


端子がなければ、100均のスピーカーを分解して直接はんだづけしちゃうのもいいですね!
参考までに、meetsで買ったスピーカー、緑と青が接続されていて、金と赤が追加スピーカー用となってました。


音がなるモノ、子供たちを惹きつけますね!(鯖江Hana道場にて)

触るウェブ、Web MIDI API x TouchMIDI32 = WebTouch

2017/09/03 23:55:00
#maker #web #js #midi 

ちょっとハードルが高い、ハードウェア工作。
でも、奇楽堂TouchMIDI32があれば、JavaScriptでタッチボタンがすぐできる!(旧10キー版は安い!)

TouchMIDI32は、32コのタッチセンサーをつなぐMIDI入力デバイス、USBでパソコンにつなぐと、MIDI IN デバイスとして使えて、Web MIDI API を使えば、ブラウザ上のJavaScriptで簡単に遊べる!

Web MIDI API は、使い方簡単!

navigator.requestMIDIAccess({ sysex: false }).then(successcallback, errcallback);

requestMIDIAccess でデバイスを受け取ったら、onmidimessage で受信したり、send で送信するだけ!


WebTouch with Web MIDI API

links
- Web MIDI API - W3C
- MIDIデバイスの準備不要、Web MIDI APIの基礎 | HTML5Experts.jp
- Web MIDI APIを触ってみた - Qiita
- Web MIDIでつなぐパソコンとIchigoJam

IchigoJam x YMF825でつくる、4オペレータFM音源音色エディタ

2017/09/02 23:55:00
#IchigoJam #sound #maker 

FM音源モジュール「YMF825Board」をフルに活かす4オペレータFM音源音色エディタを作ってみました。(準備と接続方法マシン語で高速化

音色は、ベースの高さ(BO)、音の揺れ(LFO)、アルゴリズム(ALG)の3つに、17種類のパラメータをもつ4オペレータ(68パラメータ)を加えた全71パラメータで決定します。

これらパラメータに0〜70のIDをふり、ひとつひとつ値を変更すると鳴る、シンプルな音色エディタのできあがり。デフォルトとしてシンプルな矩形波で初期化しています(80行)。

1 'FM INIT 10 OUT1,0:WAIT1:OUT4,1:OUT1,1 20 A=#700:POKEA,80,35,27,2,91,28,27,4,0,34,26,98,1,33,201,3,0,34,8,66,0,208,4,50,154,97,2,50,154,97,73,8,246,209,8,34,26,98,112,71 30 S=#728:POKES,80,35,27,2,91,28,27,4,128,33,0,34,8,66,0,208,4,50,154,97,2,50,154,97,73,8,246,209,112,71 40 LET[0],#1D01,#020E,-1,#0001,#0100,#1AA3,-1,#1A00,-30,#0204,-1,#0204,-1,#0200,#197C,#1B3F,#1400,#0301,#08F6,-21,#0800,#09FB,#0A00,#01740,#1800,0 50 FORJ=0TO99:N=[J]:IF !N J=99:GOTO70 60 IF N<0 WAIT -N ELSE U=USR(A,N) 70 NEXT 80 FORI=0TO70:[I]=0:NEXT:[20]=5:[25]=15:[35]=6 90 LRUN FILE()+1 SAVE0 NEW 1 'FM EDITOR 4OP 10 CLS:?"BO 3 0:";[0]:?"LFO 3 1:";[1]:?"ALG 7 2:";[2] 20 L="SR 15XOF 1KSR 1RR 15DR 15AR 15SL 15TL 63KSL 3DAM 3EAM 1DVB 3EVB 1MUL15DT 7WS 31FB 7" 30 FORI=0TO16:LC0,4+I:?STR$(L+I*5,5):NEXT 40 FORJ=0TO3:LC7+J*6,3:?"OP";J+1:FORI=0TO16:LC6+J*6,4+I:?DEC$(3+J*17+I,2);":";[3+J*17+I]:NEXT:NEXT 50 INPUT"ID :",I 60 INPUT"VAL:",[I] 70 GSB@SETTONE:GSB@PLAY 80 GOTO 10 100 @SETTONE 110 POKE#8A8,7,#81,[0],[1]<<6+[2] 120 FORJ=0TO3:P=3+J*17 130 POKE#8AC+J*7,[P]<<4+[P+1]<<3+[P+2],[P+3]<<4+[P+4],[P+5]<<4+[P+6],[P+7]<<2+[P+8],[P+9]<<5+[P+10]<<4+[P+11]<<1+[P+12],[P+13]<<4+[P+14],[P+15]<<3+[P+16] 140 NEXT 150 U=USR(A,#08F6):WAIT1:U=USR(A,#0800) 160 OUT4,0:FORK=0TO35:U=USR(S,PEEK(#8A8+K)):NEXT:OUT4,1 160 RTN 200 @PLAY 210 T=#1465 220 U=USR(A,#0B00):U=USR(A,#0F00):U=USR(A,#0C54):U=USR(A,#0D00+T>>8):U=USR(A,#0E00+T&#FF):U=USR(A,#0F40) 230 RTN SAVE1 LRUN0

IchigoJamの2ファイルを使います。1つは初期化、もう1つが音色エディタ本体。いい音ができたら、「FM音源キーボード」で鳴らしてみましょう!

音色エディタの画面づくりで、文字列コマンド(STR$)を使った容量削減テクニック。

10 CLS:?"BO 3 0:";[0]:?"LFO 3 1:";[1]:?"ALG 7 2:";[2] 20 L="SR 15XOF 1KSR 1RR 15DR 15AR 15SL 15TL 63KSL 3DAM 3EAM 1DVB 3EVB 1MUL15DT 7WS 31FB 7" 30 FORI=0TO16:LC0,4+I:?STR$(L+I*5,5):NEXT 40 FORJ=0TO3:LC7+J*6,3:?"OP";J+1:FORI=0TO16:LC6+J*6,4+I:?DEC$(3+J*17+I,2);":";[3+J*17+I]:NEXT:NEXT

音色エディタプログラムからの抜粋(RUN on IchigoJam web
変数Lに保存した文字列ポインタを使って「STR$(L+I*5,5)」として5文字ずつ取り出して表示しています。


SR 15 とあるのは0-15の値で指定するという意味です。
いろんな音作りにチャレンジしてみましょう。

ALG: アルゴリズム(ALG0はALG5で、ALG1はALG2で代用できるので実質6種類)

(ymf825board manual / Tone Parameterより)

WS: 発振器の波の形(0:正弦波、6:矩形波、16:三角波、26:のこぎり波、他全29種類)

(ymf825board manual / Tone Parameterより)

AR: アタックレート、立ち上がりの速さ 15で最速、0で立ち上がらない(鳴らない)
DR: ディケイレート、立ち上がり後の減衰の速さ 15で最速、0で減衰しない
SL: サステインレベル、ディケイ後の音量 15で消える、0で減衰しない
SR: サステインレート、ディケイ後の減衰の速さ 15で最速、0で減衰しない
RR: リリースレート、キーオフ後の減衰の速さ 15で最速、0で減衰しない(鳴り続ける)

FB: フィードバック、自分自身をモジュレート(オペレータ1と、オペレータ3のアルゴリズム2と5のみ)
YMF825のFM音源のパラメータのマニュアル」を見ながら、いろいろいじってみましょう。

おまけ、音色書込み用のデータから71コのパラメータ配列に戻すプログラム

1 'FM-TONE REV CONVERT 100 B=#8AA 110 V=PEEK(B):[0]=V&3 120 V=PEEK(B+1):[1]=V>>6:[2]=V&7 130 FOR I=0 TO 3 140 B=#8AA+2+I*7:P=3+I*17 150 V=PEEK(B):[P]=V>>4:[P+1]=V>>3&1:[P+2]=V&1 160 V=PEEK(B+1):[P+3]=V>>4:[P+4]=V&15 170 V=PEEK(B+2):[P+5]=V>>4:[P+6]=V&15 180 V=PEEK(B+3):[P+7]=V>>2:[P+8]=V&3 190 V=PEEK(B+4):[P+9]=V>>5:[P+10]=V>>4&1:[P+11]=V>>1&3:[P+12]=V&1 200 V=PEEK(B+5):[P+13]=V>>4:[P+14]=V&7 210 V=PEEK(B+6):[P+15]=V>>3:[P+16]=V&7 220 NEXT

C言語などへ移植する場合は、演算子の優先順位が異なるので注意!
ルールメイカーになろう! 1+2x3=? 演算子優先順位仕様変更の言い訳

links
- YMF825Board紹介
- YMF825BoardとIchigoJamの接続方法
- YMF825用マシン語高速ドライバとキーボード

BEEPで作るバンブラ奏法8bit楽器、IchigoJam1画面プログラムと蔵BAR訪問

2017/09/01 23:55:00
#IchigoJam #sound #maker 

さよなりωさんのスーファミのコントローラで、まずはIchigoJam標準BEEP音源で楽器づくり!
バンブラこと、任天堂「大合奏!バンドブラザーズ」では、上下左右と4ボタンに音階を割り当てて、ゲーム機を本格楽器化したのが画期的でした!(バンドブラザーズ解説)


ということで、IchigoJamで再現しました
Rキーで半音アップ、Lキーで1オクターブアップも対応!
古い記憶が蘇ります!

1 'SFC-C BBS 10 POKE#700,16,181,80,35,27,2,28,70,36,4,91,28,27,4,1,34,18,3,164,24,0,34,90,96,0,33,0,34,154,96,34,104,146,10,138,64,128,24,2,34 20 POKE#728,154,96,1,49,16,41,244,209,1,34,90,96,16,189 30 OUT1,1:OUT1,2:A=#700:B=0 31 LET[0],60,57,54,51,48,45,42,40,38,36,34,32 32 LET[12],9,7,-1,-1,4,0,2,5,11,12 40 N=~USR(A,0):P=N&~B:B=N 55 IF N&#3F3=0 BEEP0:GOTO40 60 T=-1:FORI=0TO9:IF [I]<0 GOTO80 70 IF P&(1<<I) T=I:I=9 80 NEXT 90 IF T<0 GOTO40 100 T=[12+T]+N>>11+N>>10&1*12 110 BEEP[T%12]>>(T/12),1000 120 GOTO40

1画面に収まる、516byte!
スーファミコントローラ接続ですが、キーボードやオリジナルボタンを使った改造のベースにもどうぞ!

音階はバイナリリコーダーでも使った、IchigoJam MML 音階周期対応表を参照、O3を基準に使いました(31行、配列0〜11)。12で割った値でビットシフトしてオクターブアップ。

IchigoJam MML 音階周期対応表

バンブラ奏法用に「RLXA→←↓↑スタートセレクトYB」の12bitで並ぶスーファミコントローラの値から、ボタンが押されたビットを検出して、音階Tを算出(32行、配列12〜)。

スピーカーは、IchigoJam標準の圧電サウンダーで物足りなければ、100円均一でスピーカーや、アンプを買ってつなぐのもオススメです!

ボタンに関するミニテクニック。
12コあるスーファミのボタンの状態をマシン語で読み取った、まとめてビット演算は「論理学習IchigoJamプリント」の応用で、全ビットを反転する「~」を使っています。

スーファミコントローラのボタンが押された(P)、離された(R)を取得するサンプルプログラム。

1 'SFC-C 10 POKE#700,16,181,80,35,27,2,28,70,36,4,91,28,27,4,1,34,18,3,164,24,0,34,90,96,0,33,0,34,154,96,34,104,146,10,138,64,128,24,2,34 20 POKE#728,154,96,1,49,16,41,244,209,1,34,90,96,16,189 30 OUT1,1:OUT1,2:A=#700:B=0 40 N=~USR(A,0):P=N&~B:R=~N&B 50 ?BIN$(P,12),BIN$(R,12) 60 B=N:GOTO 40

2週目の最終日の夏のjig.jp高専インターン生達と、河和田アートキャンプ蔵BAR」へ

開発と食事会とオールナイト - jigintern2017の日記

今年の蔵丼と、新メニュー蔵コロッケ!蔵で食べるとまた格別!

学生の熱い夏はまだまだ続きます!

links
- 河和田アートキャンプ
- 蔵BAR

amiiboも読める! マシン語で実用的になったRFID-RC522リーダー on IchigoJam

2017/08/22 23:55:00
#IchigoJam #maker #asm 

電車社会では手放せないFeliCa。
ピッと読み取るひみつは NFC(Near Field Communication / 近距離無線通信)という技術にあります。
カード側には電池が不要なので、安く、手軽に使えるのがポイントです。

先日実験した300円のNFCリーダー、RFID-RC522のIchigoJamプログラムを一部マシン語化して、実用的な速度になりました!(Amazonでタグ1枚100円未満!、リーダーRC522はなんと250円〜

FeliCaとは違う規格、RC522はMIFAREのRFIDリーダーですが、なんと任天堂の人形、amiiboが読めました!

amiibo認識するIchigoJamのデモ、子供に人気でした!

高校生三崎くんは、どこまで浮かせて読めるか早速実験!楽しいおもちゃを作って上げられそうっ

RC522-RFIDリーダープログラム、マシン語化手順(参考、SPI高速送信SPI高速受信
OUT2がSCK、OUT3がMOSI、IN1がMISOとして使う1byte(=8bit)のSPI通信は、BASICで書くとこうなります。

10 @SPI:N=0 'send:M recv:N 20 FOR I=7 TO 0 STEP-1 30 OUT2,0 40 OUT3,M>>I&1 50 N=IN(1)<<I|N 60 OUT2,1 70 NEXT

これをアセンブリ言語で書いて

@SPI PUSH {LR,R4,R5} R3=#50 ' R3=#50010000 GPIO1 R3=R3<<8 R4=R3 ' R4=#50000000 + (1<<(10+2)) IN(1) GPIO0_10 R3=R3+1 R3=R3<<16 R4=R4<<16 R2=1 R2=R2<<12 R4=R4+R2 R5=0 R1=#80 @LOOP R2=0 R0&R1 'F=N>>(7-I)&1 IF 0 goto @SKIP1 R2+=4 @SKIP1 [R3+`110]L=R2 ' OUT2,0:OUT3,F R2=2 [R3+`0010]L=R2 ' OUT2,1 R2=[R4]L ' IN(1) R2-0 IF 0 goto @SKIP2 R5=R5+R1 @SKIP2 R1=R1>>1 IF !0 goto @LOOP @END R0=R5 POP {PC,R4,R5}

レジスタの役割:R0 送信データ、R1 カウンタ、R2 書き込み用、R3 GPIO1 for OUT、R4 GPIO0 for IN、R5 受信データ

asm15アセンブラでマシン語化

10 POKE#700,48,181,80,35,27,2,28,70,91,28,27,4,36,4,1,34,18,3,164,24,0,37,128,33,0,34,8,66,0,208,4,50,154,97,2,34,154,96,34,104 20 POKE#728,0,42,0,208,109,24,73,8,242,209,40,70,48,189

前回はBASICだったSPI通信部分をマシン語呼び出しに置き換えて、できあがり!

1 'RFID-RC522 1/2 2 A=#700:POKEA,48,181,80,35,27,2,28,70,91,28,27,4,36,4,1,34,18,3,164,24,0,37,128,33,0,34,8,66,0,208,4,50,154,97,2,34,154,96,34,104 3 POKE#728,0,42,0,208,109,24,73,8,242,209,40,70,48,189 10 OUT4,0:WAIT4:OUT1,1:OUT4,1 20 LET[0],#2400,#2600,#4826,#5480,#56A9,#5803,#5AE8,#2A40,#223D 30 FORJ=0TO8:N=[J]:GSB@SPIW:NEXT 40 N=#28:GSB@SPIR:IF N&3!=3 N=#2800|N|3:GSB@SPIW 50 @LOOP:?"."; 55 LET[0],#2400,#2600,#4826 60 FORJ=0TO2:N=[J]:GSB@SPIW:NEXT 70 N=#1C:GSB@SPIR:N=#1C00|N&#7F:GSB@SPIW 90 LET[0],#200,#87F,#1480,#1226,#1A07,#20C 100 FORJ=0TO5:N=[J]:GSB@SPIW:NEXT 110 N=#1A:GSB@SPIR:N=#1A00|N|#80:GSB@SPIW 120 N=#8:GSB@SPIR:IF N&1 GOTO@LOOP 130 IF N&#30=0 GOTO120 140 N=#C:GSB@SPIR:IFN&#13?"ERR";N:GOTO@LOOP 150 N=#14:GSB@SPIR:IFN!=2GOTO@LOOP 160 N=#12:GSB@SPI2R 170 N=#18:GSB@SPIR 190 ?"!":LRUN FILE()+1 500 @SPIW:OUT1,0:U=USR(A,N>>8):U=USR(A,N):OUT1,1:RTN 510 @SPIR:OUT1,0:U=USR(A,N|#80):N=USR(A,0):OUT1,1:RTN 520 @SPI2R:OUT1,0:N=N|#80:U=USR(A,N):N=USR(A,N)<<8|USR(A,0):OUT1,1:RTN SAVE0 NEW 1 'RFID-RC522 2/2 10 N=#1C:GSB@SPIR:N=#1C00|N&~#80:GSB@SPIW:N=#1A00:GSB@SPIW 30 LET[0],#200,#87F,#1480:FORJ=0TO2:N=[J]:GSB@SPIW:NEXT 50 N=#1293:M=2<<4:GSB@SPI2W:N=#1A00:GSB@SPIW:N=#20C:GSB@SPIW 110 N=#1A:GSB@SPIR:N=#1A00|N|#80:GSB@SPIW 120 N=#8:GSB@SPIR:IFN&1GOTO@END 130 IFN&#30=0GOTO120 140 N=#C:GSB@SPIR:E=N:IFE&#13GOTO@END 150 N=#14:GSB@SPIR:IF N!=5 GOTO@END 160 M=N:N=#12:GSB@SPIAR:FORI=0TOM-1:?HEX$([I],2);:NEXT:? 170 N=#18:GSB@SPIR 190 @END:LRUNFILE()-1 'ASM 500 @SPIW:OUT1,0:U=USR(A,N>>8):U=USR(A,N):OUT1,1:RTN 505 @SPI2W:OUT1,0:U=USR(A,N>>8):U=USR(A,N):U=USR(A,M):OUT1,1:RTN 510 @SPIR:OUT1,0:U=USR(A,N|#80):N=USR(A,0):OUT1,1:RTN 530 @SPIAR:OUT1,0:N=N|#80:U=USR(A,N) 540 FORJ=0TOM-1:[J]=USR(A,N):NEXT 550 J=J+1:[J]=USR(A,0):OUT1,1:RTN SAVE1 LRUN0

* RC522の初期化とカード認識と、ID読み込みで2ファイル使います(上記はFILE0とFILE1使用)

高専インターン2日目は企画づくりとチーム決定、4名ずつ4チームが決定です!
チームとタイトルの二日目 - jigintern2017の日記

全国から集まった高専生、お土産も多彩!お返しに IchigoJamハーフキット!

鯖江市市民主役事業、中学校の先生向けプログラミング研修では、はんだづけからのパソコンづくりと、プログラミングづくり体験を実施。 興味持った子供が通える「Hana道場」が鯖江のいいところ!

未来の高専生!? 夏休み中の小学生で賑わうHana道場
Ichigoチョコ越前がにロボコンテストコース、片道攻略!

どんなロボットでも歓迎、小学生向け越前がにロボコン、エントリー締切は8月末!

Tweet
クリエイティブ・コモンズ・ライセンス
この作品は「Creative Commons — CC BY 4.0」の下に提供されています。
CC BY 福野泰介 - Taisuke Fukuno / @taisukef / high-res profile image