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

ぼくが福井で仕事する訳 - FUKUI x IT at SENQ霞が関、IchigoJamからJava はじめのいっぽ

2017/08/23 23:55:00
#fukui #IchigoJam 

ステキなコワーキングスペース、SENQ霞が関にて開催された、福井県主催イベント「地方創生セミナー FUKUI x IT
第一部のパネルでは、福井とITが相性抜群と結論。

SAP x NTT x 京福バスで、実証実験した、バスの運転手向けウェアラブル実証実験の様子を伝える、グローバル向けPR動画
紹介しているのは、SAPジャパン、3年で80回福井に通った吉越さん!

動画出演もしている京福バス社長の天谷さんは鯖江在住、鯖江の日本酒「梵」の加藤社長とも同級生!
キレイになった福井駅前の様子、福井のまちなみが、福井出身の人向けの見どころです!(参加者の半分くらいが福井出身の方でした)

若者だらけの深セン、アフリカ、東南アジアに負けない日本の強みは多様性。

鯖江では、今年で10回目となる鯖江市地域活性化プランコンテスト、全国から集った大学生によるアイデアを、地元の市民・市役所が一丸となって実現へ向けて動いちゃうところが特徴。

Hana道場で始まった、こどもプログラミングで育ったこどもたち、地元の福井高専生に加えて、プログラミングを教えられるシニアの人たちが加わり、実現力が更にアップ!

実現プランを培ったブランド力をベースに全国・全世界へ発信し、新しいコラボのきっかけに!

福井高専卒業後、アルバイトさせてもらった永和システム平鍋さん、福井高専の先輩、北野さんによる二部!
チェンジビジョンの製品「astah*」の前身「JUDE」には、アルバイトしてコミットしたコードがまだ残っているとのうれしい話!

JUDE = Java and UML Developers' Environment の略称、199年のJava登場以来、大好きなJavaを使った仕事でした。

その頃を思い出し、ひさびさに java.awt package を使って、IchigoJamからJavaへのステップアップする子供向けのシンプルなコードを書いてみました。

名付けて「IchigoCafe」Javaはclassファイルという中間コードに変換し、Java VMという仮想マシンで動かしますが、classファイルの識別子が16進数8桁、4byteのCAFEBABE。IchigoJamっぽくプログラムがかけるコードへと進化させてみてください。(src on GitHub)

javac Main.java java Main

実行するには、JDKをインストールして、コンソールで、javacでコンパイル、javaで実行!


ぼくが福井で仕事する訳、それは、世界中のどこよりも福井で仕事することが楽しいから。
いろんなきっかけをくれ続けてくれる福井県。
ますます楽しい、FUKUI x IT!

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 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月末!

Team伊勢発のロボットカー「Ichigoチョコ」入門用プリント、jigインターン2017もスタート

2017/08/21 23:55:00
#IchigoJam #KidsIT #doc #kosen 

PCN三重から届いたTeam伊勢のロボットカー「Ichigoチョコ」
Hana道場でIchigoJamをはんだづけした小学生の女の子、再びプログラミングしにきてくれました!
エルチカでウォームアップしたら、Ichigoチョコの組み立て!
組み立ては簡単で5分で完成、早速プログラミングに挑戦!

OUT6

とかいて、エンター、すぐに前進!わーっと驚きの声がかわいい。

10 OUT6:WAIT120 20 OUT0 RUN OK SAVE0 Saved 24byte OK

プログラムをつくって、ためして(F5)、ほぞん(F3)したら、スイッチをOFFにしてケーブル抜いて、フィールドテスト!

スイッチをRUNにすると自動起動、RESETスイッチで何度も試せる!
再びプログラムする場合は一旦OFFにして、ケーブルをつないで、スイッチをPROGへ。
小学生のこどもたち、何度かやって、自分のモノにした様子!

小学生向け越前がにロボコンのテストコース、Hana道場にあるので、いつでも遊びに来てね!
思い通りの動きになるまで、何度でも挑戦し放題。

IchigoJamプリントに「Ichigoチョコ(PDF)」を追加!

全国から16名の高専生が鯖江に集まる、jig.jp 夏のインターンもスタート!
毎日更新インターンブログ「jigintern2017の日記」もお楽しみにっ

中高生開発の越前がにロボットの作り方・使い方 - 越前がにロボコン事前講習会

2017/08/20 23:55:00
#IchigoJam #KidsIT #doc 

今年初開催、福井県システム工業会30周年記念「越前がにロボコン」へ向けた事前講習会、その2。
今回は、鯖江Hana道場発、中高生ユニットによるオリジナルロボットキット!

越前がにロボット開発者、メカ担当 MASAHRU(中2) & 基板担当 MISAKI(高2)


宇宙へ飛び出す越前がにロボット、テスト用のミニはやぶさロードを疾走!

越前がにロボットの作り方・使い方 - 越前がにロボコン事前講習会#2


会場は、福井駅隣、AOSSA 1F


たくさんの道具とパーツ、越前がにロボの足がおいしそう!?


越前がにロボコン実行委員長、木下さん!
2020年のプログラミング必修化に福井は先駆けますよ


基板のはんだづけから組み立てスタート!


基板に本体をネジ止めして、モーターをや足をネジ止めしていきます


プラグラムを作ったら、テストコースで試走!
テストコースは、福井ナチュラルスタイルのクラブ、鯖江Hana道場に置いてあります!


8本足で歩く越前がにロボの肝は、スムーズに動く足。
手で回してみて、ひっかかりがあるようなら、要調整。


9台のロボットと、こどもロボットエンジニアが誕生!


越前がにロボコンには、どんなロボットでも参加できます。
* 難易度の高い歩行型ロボだと得点1.5倍ボーナス
本大会は2017.11.26(日曜日)@福井、県外からもどうぞ!
参加エントリーの締切は、2017/8/31(木)!

myThings x sakura.io x IchigoJam で小学生でも簡単サーバー不要のIoTデバイスづくり、sakura.ioハンズオン(データ受信編)

2017/08/19 23:55:00
#IchigoJam #KidsIT #IoT 

データ発信編で、IchigoJamからのデータ送信が確認できたら、受信側も実験してみましょう。
今回はYahoo! JAPANの便利なサービス「myThings」を使います。


myThingsのLED1ボタンを押したら、IchigoJamのLEDがつく!
コマンド増やし放題!音がなったり、ゲームが始まったり、サーボで何かを叩いたり!?


「ボタンを押したら」でボタンを作って、アクションから「sakura.io」を選択。(初回は認証のためsakura.ioへのログインが必要)
モジュールIDを書いて、値を1、名前を「LED1」として作成。
同様に、値を0、名前を「LED0」としてもうひとつボタンを作成。

次はIchigoJamのプログラムです。
モジュールの準備で、データを受信したときに1になる信号が、IN(1)に接続したので、この値を見て、1になったら値を読み、その値によって動作するようにプログラムします。

10 OUT1,1 20 IF IN(1)=0 CONT 30 POKE#800,#30,0,#30:IF I2CR(79,#800,3,#820,22) STOP 40 N=[18]:?N 50 IF N=1 LED1 60 IF N=0 LED0 70 GOTO20

簡単ですね!(40行、N=PEEK(#824)|PEEK(#825)<<8 としても同様です)
sakura.ioの起動にしばらく時間がかかるので、1回点滅になるまでまって、myThingsのボタンを押しましょう。

前回のデータ発信も myThings に接続すると、簡単にスマホへ通知、Twitter/LINE/Facebookへ連携もできますよ!

ネコIoTなども、簡単に実現できますね!

links
- sakura.io デバイス準備&データ発信編
- sakura.io データ受信編
- さくらインターネットが提供するIoTプラットフォームサービス、sakura.io
- myThings - あなたの毎日が、組み合わせで便利になる
- こどもパソコン IchigoJam - はじめてのプログラミングパソコン(1500円)

小学1年生でもOK、ボードゲーム「CoderBunnyz」とロボット「Ichigoチョコ」で体感プログラミング at Hana道場

2017/08/18 23:55:00
#IchigoJam #KidsIT #movie 

子供ものづくり天国「Hana道場」(具体的には、20歳未満はIchigoJam、3Dプリンター、レーザーカッターの利用が無料!)
夏休み、また新たに子供たちにプログラミングのきっかけを提供する、イベント&新グッズ導入!


夏休み企画、IchigoJamはんだづけ&プログラミング!


IchigoJamづくりに集まった小学生、はんだづけに、プログラミング指導に徳橋さん大活躍!


はんだづけ、失敗しても大丈夫!はんだ吸い取り線に初挑戦する小学生。ちょっと火傷するくらいがちょうどいい。


見学していた小学1年生を誘ってCoderBunnyzで一緒に遊びました。
いち早く人参を食べてゴールへ導くプログラミングゲーム。最初は、前進、右向く、左向く、ジャンプの4種類だけで練習。
次のゲームでは、くりかえしカードも駆使して、見事子供が勝利!


CoderBunnyzは、アメリカの小学生の女の子が創ったプログラミングが学べるボードゲーム!
シンプルな動きの逐次実行、くりかえし、関数カードで抽象化、カードの並びでスタックとキューなど、プログラミングで使う基礎が遊びながら習得できちゃう!


写真:作者のサマイラちゃんと!Maker Faire Bayareaにて


PCN三重から届いたIchigoチョコ
コンパクトに手軽にロボットプログラミングを始められ、本格的な自律ロボットづくりまで幅広く使える!


CoderBunnyzで遊んだ「順番に実行(逐次処理)」を、ロボットに応用しよう!


CoderBunnyzも導入、鯖江駅から徒歩でもいけるHana道場。プログラミングの自習はいつでも無料です。
8/21(月)の17時〜、越前がにロボコンに向けた、小学生向けIchigoチョコのミニ講座も開催します!

links
- Ichigoチョコ / PCN三重 - IchigoJamとつなぐコンパクトで使い勝手いいロボット
- CoderBunnyz - プログラミングが学べるボードゲーム(shipito経由で日本発送も可)

IchigoJamで読むRFID、300円で買える非接触ICカードリーダー「RFID-RC522」でNFC実験

2017/08/17 23:55:00
#IchigoJam #maker 

かざすだけでピッと読み取る、NFC(近距離無線通信)を使った、日本の非接触ICカード。
日本の代表格は、Suicaで有名なソニーのFeliCa
ただ、残念ながら世界の標準はNXPのMIFAREが押さえてます。(シェア7割)

MIFAREは特徴は安さ!
なんと、数百円でカードとチップのテストRFID付きで買えちゃいます。
AmazonでRC522で検索すると200円台も!」

接続方法は、温湿度計ADT7310FM音源YMF825スーファミコントローラーでもお馴染みSPI
ということで、IchigoJamにつないでみました。


RC522にかざすと反応して、カード固有のIDの4byteだけを取得して表示するデモ動画(BASICでゆっくり読み取り版)

IchigoJam x RC522 接続方法

RC522 - IchigoJam
SDA - OUT1 *SDA=SS chip select的なピン
SCK - OUT2 *クロックはMasterが担当
MOSI - OUT3 *MOSI = Master Out Slave In
MISO - IN1 *MISO = Master In Slave Out
IRQ NC
GND - GND
RST - OUT4
3.3V - VCC

データシートを読むのが筋ではありますが、GitHubにある「Arduino RFID Library for MFRC522」を基にIchigoJam BASICでひとまず作ってみました。 2ファイル、2KBくらいのプログラムになりました。

1 'RFID-RC522 1/2 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:IF N&#13 ?"ERR1:";N:GOTO@LOOP 150 N=#14:GSB@SPIR:IF N!=2 ?"ERR2":GOTO@LOOP 160 N=#12:GSB@SPI2R 170 N=#18:GSB@SPIR 190 ?"!":LRUN FILE()+1 500 @SPIW:OUT1,0:FORI=15TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT:OUT1,1:RTN 510 @SPIR:OUT1,0:N=N|#80:FORI=7TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT:N=0:FORI=7TO0STEP-1:OUT2,0:N=IN(1)<<I|N:OUT2,1:NEXT:OUT1,1:RTN 520 @SPI2R:OUT1,0:N=N|#80:FORI=7TO0STEP-1:OUT2,0:OUT3,M>>I&1:OUT2,1:NEXT:M=N<<8:N=0:FORI=15TO0STEP-1:OUT2,0:OUT3,M>>I&1:N=IN(1)<<I|N:OUT2,1:NEXT:OUT1,1:RTN

ファイル1つ目では、リーダーの初期化とカードを認識するまでを担当。190行でUUID読み出しファイル(次の番号を想定)へLRUN!

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 500 @SPIW:OUT1,0:FORI=15TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT:OUT1,1:RTN 505 @SPI2W:OUT1,0:FORI=15TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT:FORI=7TO0STEP-1:OUT2,0:OUT3,M>>I&1:OUT2,1:NEXT:OUT1,1:RTN 510 @SPIR:OUT1,0:N=N|#80:FORI=7TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT:N=0:FORI=7TO0STEP-1:OUT2,0:N=IN(1)<<I|N:OUT2,1:NEXT:OUT1,1:RTN 530 @SPIAR:OUT1,0:N=N|#80:FORI=7TO0STEP-1:OUT2,0:OUT3,N>>I&1:OUT2,1:NEXT 540 FORJ=0TOM-1:[J]=0:FORI=7TO0STEP-1:OUT2,0:OUT3,N>>I&1:[J]=IN(1)<<I|[J]:OUT2,1:NEXT:NEXT 550 J=J+1:[J]=0:FORI=7TO0STEP-1:OUT2,0:OUT3,0:[J]=IN(1)<<I|[J]:OUT2,1:NEXT:OUT1,1:RTN

本体はそんな長くないですが、SPIの読み書きにいくつかパターンがあるので、長くなってしまって、ちょうど制限いっぱいの1024byte。 1つ目をファイル1に書き込んだら、こちらはファイル2と、次の番号に保存して使います。190行のLRUN FILE()-1 で、カード待ちに戻しています。

この戻る部分を改造すると、カードによって、いろいろなことをさせることができますね!
IchigoJam本体の保存容量だけでもまだ2ファイル分、2KB使えます!MixJuicesakura.ioでネットにつなぐのも楽しそう。
MIFAREでAmazonを検索するとカード1枚あたり100円台から買えます」
(少量だとリーダー買うほうが安い不思議w)

今回表示しているのはUUIDのたぶん先頭4byteのみ。後ろの1byteはデータ化け対策のCRCです。
本当のUUIDはもうちょっと長いと思いますが、お気軽実装ということで省略しました。
必要がでてくれば、データシートを読んで、ちゃんとした読み取りにも対応することにします。

BASICで読み取っているので、結構ゆっくりですが動作の確認ができたので、実用化する際はマシン語化ですね!
参考「マシン語で高速SPI、IchigoJamでまなぶ ARMマシン語入門その9」「マシン語SPIでコントローラ信号読み出し
マシン語化しました!(追記、2017.8.23)

54byteのスーファミコントローラドライバ、IchigoJam BASICとマシン語でつなぐ極上のコントローラ

2017/08/16 23:55:00
#IchigoJam #asm #game 

IchigoJamにスーファミコントローラがつながりました!
個人的コントローラランキング、ナンバーワンのスーファミコントローラ、konashiでiPhoneにつないだこともありました。

接続に便利だった、Raspberry Piのスーパーファミコン化プロジェクトのコントローラ変換器!(official site)

こちら先日のコミケC92で入手! (スーファミコスプレな @ichigonosaatan さぁたん)

配線は本の記述とはちょっと違っていて、CLKの上にある3.3V、P/Sの下にあるGNDを使っていました。
スーファミのコントローラ3.3Vでも動くようです!

ファミコンもスーファミも、コントローラとの通信はYMF825と同じ、おなじみSPI。
ファミコンは8bit、スーファミはボタンが増えた分、上位8bitが追加されて16bitでの通信となります。

ひとまず、下記のようにつないで、IchigoJam BASICで動作確認。
OUT1 P/S(LATCH)
OUT2 CLK
IN1 1PAD

10 OUT1,1:OUT2,1 20 GSB@SPIR:?BIN$(N,16):CONT 100 @SPIR:OUT1,0:N=0:FORI=0TO15:OUT2,0:N=IN(1)<<I|N:OUT2,1:NEXT:OUT1,1:RTN

これだけで動きました!感動!

ただ、ゲームなどに使うには動作が遅すぎるので、マシン語でSPIテクニックを使って、高速化します。

@SPIR PUSH {LR,R4} R3=#50 ' R3=#50010000 GPIO1 R3=R3<<8 R4=R3 ' R4=#50000000 + (1<<(10+2)) IN(1) R4=R4<<16 R3=R3+1 R3=R3<<16 R2=1 R2=R2<<12 R4=R4+R2 R2=0 [R3+`0001]L=R2 ' OUT1,0 R1=0 @LOOP R2=0 [R3+`0010]L=R2 ' OUT2,0 R2=[R4]L ' IN(1) R2=R2>>10 R2<<=R1 R0=R0+R2 R2=2 [R3+`0010]L=R2 ' OUT2,1 R1+=1 R1-16 IF !0 goto @LOOP @END R2=1 [R3+`0001]L=R2 ' OUT1,1 POP {LR,R4}

マシン語入門その4を参考にIN1を調べるとピンの名前はPIO0_10、GPIO0のベースアドレスが#50000000と分かります。

できあがった、マシン語のスーファミコントローラドライバ(ファミコンにも使えます)を組み合わせたテストプログラムがこちら

1 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 2 POKE#728,154,96,1,49,16,41,244,209,1,34,90,96,16,189 10 OUT1,1:OUT2,1 20 N=USR(#700,0):?BIN$(N,16):CONT

マシン語は一度メモリに書き込んでおけばOKなので、メインプログラムを広々使っていろいろつくれますね!

BASICとマシン語の動作速度の違いが分かる動画がこちら!

IchigoJamでスーファミコントローラを読む(BASICとマシン語でSPI)

スーファミコントローラ接続、真の狙いは、FM音源モジュールYMF825Boardと合わせた楽器づくり!

YMF825で楽器づくり「FM音源キーボード」マシン語で高速SPI、IchigoJamでまなぶ ARMマシン語入門その9

2017/08/15 23:55:00
#IchigoJam #music #asm 

FM音源チップ、YMF825、IchigoJam BASICで鳴ったので、次は楽器づくり!
問題は、BASICでは遅いこと。音を鳴らすための2byteのSPI送信5回に、0.73秒もかかっているので、ゆっくりチャイムを鳴らすくらいしか使えません。
* SPIとは、クロックに合わせて信号を送受信するシンプルな通信方式 (SPI on Wikipedia)


FM音源キーボード on IchigoJam デモ動画

おや!?小気味よく鳴ってますね!これがマシン語パワーです!
復習を兼ねて、OUTポートをマシン語で使う実験をしてみます。(参考、マシン語でLEDを光らせよう

LEDが接続されている端子は、PIO1_5、アドレスとしてはPIO1のベースアドレス#50010000に、2進数の`10000000(= 1&<&<(5+2))を加えた場所に書き込めばOK!

@LED1 R3=#50 ' R3=#50010000 R3=R3<<8 R3=R3+1 R3=R3<<16 R2=`10000000 R3=R3+R2 R2=R2>>2 [R3]L=R2 ' GPIO1_5 <- 1 RET

asm15アセンブラを使うか、ハンドアセンブルして、できたマシン語コードを動かしてマシン語でLED1!

POKE#700,80,35,27,2,91,28,27,4,128,34,155,24,146,8,26,96,112,71 ?USR(#700,0)

次はBASICでつくったSPI送信をマシン語化します。

@SPIW:OUT4,0:FORI=0TO15:OUT2,0:OUT3,N>>(15-I)&1:OUT2,1:NEXT:OUT4,1:RTN

まずは分解!

OUT4,0 FORI=0TO15 F=N>>(15-I)&1 OUT2,0:OUT3,F OUT2,1 NEXT OUT4,1 RTN

ひとつずつマシン語化すれば、できあがり!

@SPIW R3=#50 ' R3=#50010000 R3=R3<<8 R3=R3+1 R3=R3<<16 R2=0 [R3+`1000]L=R2 ' OUT4,0 R1=1 R1=R1<<15 @LOOP R2=0 R0&R1 'F=N>>(15-I)&1 IF 0 goto @SKIP R2+=4 @SKIP [R3+`110]L=R2 ' OUT2,0:OUT3,F R2+=2 [R3+`110]L=R2 ' OUT2,1 R1=R1>>1 IF !0 goto @LOOP @END R2=8 [R3+`1000]L=R2 ' OUT4,1 RET

アセンブラasm15を使って2byte送信SPIマシン語バイナリができました!
送信したい16bitの数値を、USRコマンドの第二パラメータにいれるだけ!(マシン語にはレジスタR0として渡される)

POKE#700,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

準備ができたので、早速楽器づくり、まずはIchigoJamのボタンを使った単音楽器で実験!
前回のYMF825の初期化プログラムを動かし、音がなる状態にしてからNEW、次のプログラムを入力。
*マシン語化した初期化プログラム、後述します

1 'FM BTN 10 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 20 T=#1465 30 IF !BTN() CONT 40 U=USR(A,#0B00):U=USR(A,#0C54):U=USR(A,#0D00+T>>8):U=USR(A,#0E00+T&#FF):U=USR(A,#0F40) 50 IF BTN() CONT 60 U=USR(A,#0F00) 70 GOTO 30

ボタンを押したら鳴り始め、離したたらキーオフ!
反応速度もいい感じ!いろんなボタンをつなげて遊べそうですね!
*時間を測ってみると、1回の送信でTICKで1、約1/60秒、100倍速い!

次は、キーボードで楽器キーボードをつくってみます。
キーボードのZXCがドレミ、SDなどで半音にも対応します。

1 'FM KEYBOARD 10 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 100 FORI=0TO15:U=USR(A,#0B00+I):U=USR(A,#0F30):U=USR(A,#1071):U=USR(A,#1101):U=USR(A,#1208):U=USR(A,#1300):U=USR(A,#0C54):NEXT 200 LET[0],357,378,401,425,450,477,505,535,567,601,637,674 210 M="ZSXDCVGBHNJM,L." 220 K=INKEY():IF!KCONT 230 N=0 240 IF PEEK(M+N)=K GOTO300 250 N=N+1:IF N=15 GOTO 220 260 GOTO240 300 ?N:T=[N%12]:B=4+N/12:T=T&#7F+T>>7<<11+B<<8 310 U=USR(A,#0B00+N):U=USR(A,#0F00): 320 U=USR(A,#0D00+T>>8):U=USR(A,#0E00+T&#FF):U=USR(A,#0F40) 330 GOTO 220

キーは離されたタイミングが取得できないので、キーが押された時に、キーオフ(310行)してから、キーオン(320行)するようにしています。

ついでに、初期化コードもマシン語で高速化!

1 'FM INIT 10 OUT1,0:WAIT1:OUT4,1:OUT1,1 13 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 14 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 15 'INIT 20 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 22 FORJ=0TO99:N=[J]:IF!N J=99:GOTO26 24 IF N<0 WAIT -N ELSE U=USR(A,N) 26 NEXT 30 'SETCH 31 LET[0],#0F30,#1071,#1101,#1208,#1300 32 FORJ=0TO4:U=USR(A,[J]):NEXT 40 'SETTONE 41 U=USR(A,#08F6):WAIT1:U=USR(A,#0800) 42 LET[0],7,#81,1,#43,0,#E7,#FF,#9D,0,#10,#40,#20,#33,#E2,#73,0,#50,#40,#10,#41,#D3,#5B,0,#10,#41,#20,#63,#D4,2,1,#10,#40,#80,3,#81,#80 43 M=36 50 @SPIAW:OUT4,0:FORK=0TOM-1:U=USR(S,[K]):NEXT:OUT4,1

配列をSPIで送信する @SPIAW の内部、8bitのSPI送信もマシン語化しました(アドレス#728=S)

@SPI1W R3=#50 ' R3=#50010000 R3=R3<<8 R3=R3+1 R3=R3<16 R1=#80 @LOOP R2=0 R0&R1 'F=N>>(7-I)&1 IF 0 goto @SKIP R2+=4 @SKIP [R3+`110]L=R2 ' OUT2,0:OUT3,F R2+=2 [R3+`110]L=R2 ' OUT2,1 R1=R1>>1 IF !0 goto @LOOP @END RET

FM音源音色エディタもマシン語化!

1 'FM EDITOR 5 CLS 10 ?" 1 BO 3:";[40] 20 ?" 2 LFO 3:";[41] 30 ?" 3 ALG 7:";[42] 40 LET[80],"SR 15","XOF 1","KSR 1","RR 15","DR 15","AR 15","SL 15","TL 63","KSL 3","EAM 1","DAM 3","EVB 1","DVB 3","MUL15","DT 7","WS 31","FB 7" 50 FORJ=0TO1:FORI=0TO16:LCJ*15,3+I:?DEC$(4+I+J*17,2);" ";STR$([80+I]);":";[43+I+J*17]:NEXT:NEXT 60 INPUT"ID :",I 70 INPUT"VAL:",V:[39+I]=V 75 GSB@TESTTONE 80 GOTO 5 100 @TESTTONE 110 LET[0],7,#81,[40],[41]<<6+[42] 120 FORJ=0TO1:P=43+J*17 130 LET[4+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]<<4+[P+10]<<5+[P+11]+[P+12]<<1,[P+13]<<4+[P+14],[P+15]<<3+[P+16] 132 NEXT 141 U=USR(A,#08F6):WAIT1:U=USR(A,#0800) 143 M=36:GSB@SPIAW 150 T=#1465 160 U=USR(A,#0F00):U=USR(A,#0B00):U=USR(A,#0C54):U=USR(A,#0D00+T>>8):U=USR(A,#0E00+T&#FF):U=USR(A,#0F40) 180 RTN 1010 @SPIAW:OUT4,0:FORK=0TOM-1:U=USR(S,[K]):NEXT:OUT4,1:RTN

YMF825初期化コード実行後に動かし、いい音色ができたら、ボタン楽器や、キーボード楽器で演奏しよう!

Enjoy to create original musical instruments with FM!
オリジナル楽器作りを楽しもう!

links
- YMF825 x IchigoJamで鳴らすFM音源チャイム、BASICでつくるYMF825Board用FM音源エディタ (ハードウェア準備、接続方法)
- YMF825Board GitHubPage へようこそ!
- ヤマハ製YMF825使用FM音源LSIモジュール: 組立キット 秋月電子通商 電子部品 ネット通販
- ヤマハFM音源LSI YMF825搭載モジュール YMF825Board - SWITCH-SCIENCE

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

YMF825 x IchigoJamで鳴らすFM音源チャイム、BASICでつくるYMF825Board用FM音源エディタ

2017/08/14 23:55:00
#IchigoJam #music 

三島で見た謎FM音源MFTで入手したYAMAHAYMF825Board、IchigoJam BASICで鳴らすことに成功! 標準装備のPSG音源、シリアル2本ケーブルで制御するMIDI音源に加え、FM音源もOK!FM音源といえば、MSX2+を買ってもらって音楽の教科書からいろいろ打ち込んで遊んでました。PLAY#2!


FM音源で鳴らす、学校のチャイム風!

YMF825Boardの使い方
※3.3Vで使うために基板にちょっと工作が必要です(YMF825Board Rev.Aを見て、8/15追記)

小さな抵抗 R0 を外し、S1にあるパッド3つをはんだでつなぐ(はんだブリッジ)ことで、SPIの信号が3.3Vで使えるようになります。


R0 は、はんだ吸い取り線を重ねて上から熱しながらピンセットで取りました。


難関だったS1のはんだブリッジ、3つのパッドが全部つながるようにはんだが乗ればOK!
今回はなかなかうまくつかないので諦めて、回路図からICの8ピンVDDと9ピンIO/VDDに3.3VがつながればOKとわかったのでLEDなどの線の切れ端を使ってS1の大きいパッドからIC8ピン9ピンの間とをはんだづけ。
(パッド間がもっと近いと楽になりそう)


SPIで制御するYMF825Boardとの接続はジャンパーワイヤー7本。
電源で3本、5V/3.3V/GND
RST_N (リセット) - OUT1
SCK (クロック) - OUT2
MOSI (データ送信) - OUT3
SSN (チップセレクト) - OUT4
ステレオジャックに、イヤホンかスピーカーに接続すればOK!

こちらドレミファソと鳴るテストプログラム

10 OUT1,0:WAIT1:OUT4,1:OUT1,1 15 'INIT 20 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 22 FORJ=0TO99:N=[J]:IF!N J=99:GOTO26 24 IF N<0 WAIT -N ELSE GSB@SPIW 26 NEXT 30 'SETCH 31 LET[0],#0F30,#1071,#1100,#1208,#1300 32 FORJ=0TO4:N=[J]:GSB@SPIW:NEXT 40 'SETTONE 41 N=#08F6:GSB@SPIW:WAIT1:N=#0800:GSB@SPIW 42 LET[0],7,#81,1,#43,0,#E7,#FF,#9D,0,#10,#40,#20,#33,#E2,#73,0,#50,#40,#10,#41,#D3,#5B,0,#10,#41,#20,#63,#D4,2,1,#10,#40,#80,3,#81,#80 43 M=36:GSB@SPIAW 60 'KEYON 65 LET[50],#1465,#1C11,#1C42,#1C5D,#2417 70 FORM=0TO4:N=[50+M] 75 ?N 80 LET[0],#0B00,#0C54,#0D00+N>>8,#0E00+N&#FF,#0F40 90 FORJ=0TO4:N=[J]:GSB@SPIW:NEXT 100 WAIT30 110 N=#0F00:GSB@SPIW 125 NEXT 130 GOTO70 1000 @SPIW:OUT4,0:FORI=0TO15:OUT2,0:OUT3,N>>(15-I)&1:OUT2,1:NEXT:OUT4,1:RTN 1010 @SPIAW:OUT4,0:FORK=0TOM-1:N=[K]:FORI=0TO7:OUT2,0:OUT3,N>>(7-I)&1:OUT2,1:NEXT:NEXT:OUT4,1:RTN

ArduinoのサンプルをIchigoJam BASICに移植)

YMF825にはプリセット音源はないため、音色パラメータを最初に書き込んであげる必要があります(42行)。
FM音源攻略のため、2オペレータのパラメータを編集できるFM音源エディタをつくってみました。

YMF825 FM音源エディタ on IchigoJam

まずはYMF825の初期化コード

1 'FM INIT 10 OUT1,0:WAIT1:OUT4,1:OUT1,1 15 'INIT 20 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 22 FORJ=0TO99:N=[J]:IF!N J=99:GOTO26 24 IF N<0 WAIT -N ELSE GSB@SPIW 26 NEXT 30 'SETCH 31 LET[0],#0F30,#1071,#1100,#1208,#1300 32 FORJ=0TO4:N=[J]:GSB@SPIW:NEXT 33 FORI=0TO37:[I+40]=0:NEXT 35 LRUN2 1000 @SPIW:OUT4,0:FORI=0TO15:OUT2,0:OUT3,N>>(15-I)&1:OUT2,1:NEXT:OUT4,1:RTN SAVE0

2番ファイルに保存するメインのエディタプログラム(初期化プログラムの35行で呼び出し)
最初のINPUTで番号を指定して、次のINPUTで値を設定(各パラメータに書いてある最大値を超えないように注意)

1 'FM EDITOR 5 CLS 10 ?" 1 BO 3:";[40] 20 ?" 2 LFO 3:";[41] 30 ?" 3 ALG 7:";[42] 40 LET[80],"SR 15","XOF 1","KSR 1","RR 15","DR 15","AR 15","SL 15","TL 63","KSL 3","EAM 1","DAM 3","EVB 1","DVB 3","MUL15","DT 7","WS 31","FB 7" 50 FORJ=0TO1:FORI=0TO16:LCJ*15,3+I:?DEC$(4+I+J*17,2);" ";STR$([80+I]);":";[43+I+J*17]:NEXT:NEXT 60 INPUT"ID :",I:IF I=0 LRUN3 70 INPUT"VAL:",V:[39+I]=V 80 GOTO 5 SAVE2

何も入力せずエンター(または0入力)で、テストで鳴らす音プログラム3番に

1 'FM TEST TONE 10 LET[0],7,#81,[40],[41]<<6+[42] 20 FORJ=0TO1:A=43+J*17 30 LET[4+J*7],[A]<<4+[A+1]<<3+[A+2],[A+3]<<4+[A+4],[A+5]<<4+[A+6],[A+7]<<2+[A+8],[A+9]<<4+[A+10]<<5+[A+11]+[A+12]<<1,[A+13]<<4+[A+14],[A+15]<<3+[A+16] 32 NEXT 41 N=#08F6:GSB@SPIW:WAIT1:N=#0800:GSB@SPIW 43 M=36:GSB@SPIAW 60 'TEST TONE 66 W=30:B=4 70 A=357:GSB@KON:WAITW:GSB@KOFF 130 LRUN2 300 @KON:N=A&#7F+A>>7<<11+B<<8:LET[0],#0B00,#0C54,#0D00+N>>8,#0E00+N&#FF,#0F40 310 FORJ=0TO4:N=[J]:GSB@SPIW:NEXT:RTN 400 @KOFF:N=#0F00:GSB@SPIW:RTN 1000 @SPIW:OUT4,0:FORI=0TO15:OUT2,0:OUT3,N>>(15-I)&1:OUT2,1:NEXT:OUT4,1:RTN 1010 @SPIAW:OUT4,0:FORK=0TOM-1:N=[K]:FORI=0TO7:OUT2,0:OUT3,N>>(7-I)&1:OUT2,1:NEXT:NEXT:OUT4,1:RTN SAVE3


パラメータを設定して、エンターでテストトーン!

YMF825のFM音源の音色づくりの基本

4つの発振器(オペレータ)のつながりを選ぶ、アルゴリズム。第一オペレータを鳴らすアルゴリズム1を選択(ALG:1)

(ymf825board manual / Tone Parameterより)

かつて(MSX時代)は正弦波だけだった発振器、YMF825では29種類から選べます!
音が大きて確認しやすい、ファミコンで有名、三角波を選んでみます(Wave Shape, WS:16)

(ymf825board manual / Tone Parameterより)

次にエンベロープをADSR(アタックAR、ディケイDR、サステインSR/SL、リリースRR)をそれぞれ0-15の値で指定します。
AR: アタックレート、立ち上がりの速さ 15で最速、0で立ち上がらない(鳴らない)
DR: ディケイレート、立ち上がり後の減衰の速さ 15で最速、0で減衰しない
SL: サステインレベル、ディケイ後の音量 15で消える、0で減衰しない
SR: サステインレート、ディケイ後の減衰の速さ 15で最速、0で減衰しない
RR: リリースレート、キーオフ後の減衰の速さ 15で最速、0で減衰しない(鳴り続ける)

まずARを15、RRを15にして鳴らしてみましょう。
ポーっとファミコンっぽい音が鳴ります。

アタックとリリース
ARを5にすると、ふわっと音が鳴り始めます。
RRを5にすると、ふわっと音が消えるようになります。
いろいろ変えてみましょう。

ディケイ
AR、RRを15に戻して、SLを7、DRを10にしてみましょう。
最初音が大きくて、その後小さい音が続きます。
後半の小さな音の音量をSLで調整(0で変化なし、15で消える)し、その音量になるまでの速さをDR(15で即変わる)で指定します。

サステイン
SRを7とすると、後半の小さな音が徐々に減衰するようになります。
キーオフした後の減衰はリリースRRで調整します。

アルゴリズム1は、2番目のオペレータを使って変調(モジュレート)できます。
右側(第二オペレータ)のARとRRを15にして、みると音が変化します。
モジュレーターの効き具合は、TLで調整します(0で最大、63で無効化)。

このように発振器をいろいろつなぎ合わせて音を創る、それがFM音源!
2つのオペレータで慣れたら、4オペレータをフルに使った音作りに挑戦です!

冒頭の動画は、ファイル3の鳴らす部分をこのようにチャイムに書き換えました!
オクターブ(B)が4、音階(A)で指定する数値は、YMF825のマニュアル内のExcelファイルに一覧もあります。

60 'CHIME 66 W=30:B=4 70 A=674:GSB@KON:WAITW:GSB@KOFF 71 A=535:GSB@KON:WAITW:GSB@KOFF 72 A=601:GSB@KON:WAITW:GSB@KOFF 73 A=401:GSB@KON:WAITW*2:GSB@KOFF 80 A=401:GSB@KON:WAITW:GSB@KOFF 81 A=601:GSB@KON:WAITW:GSB@KOFF 82 A=674:GSB@KON:WAITW:GSB@KOFF 83 A=535:GSB@KON:WAITW*2:GSB@KOFF

BASICによるソフトウェアSPIだと遅くてリアルタイムな演奏には向かないので、次は一部マシン語化した楽器プログラムに挑戦してみたいと思います。(参考、マシン語入門
→ マシン語編「YMF825で楽器づくり「FM音源キーボード」マシン語で高速SPI、IchigoJamでまなぶ ARMマシン語入門その9

links
- YMF825Board紹介 - Yamaha (公式サイト、マニュアル、サンプルプログラムあり)
- YMF825 SD-1 universal Sound Designer 1 - YAMAHA
- YMF825Board Rev.A (YMF825Board 製造元のウダデンシさんサイト)
- YMF825 FM音源モジュールを使ってみた - きょうのかんぱぱ (Arduinoで音色変更例)
- YMF825(SD-1)ざっくりまとめ(スペック編) - Lost Technology
- アナログシンセとはまったく違う、“誰でもわかるFM音源”講座 : 藤本健の“DTMステーション” (かつて240万円したFM音源シンセサイザー)
- ボードで復活!! 生方剛考のFM音源講座
- 今夜わかるFM音源 - aikeの日記
- FM音源の音作りをアナログな感覚で覚えよう① : SynthSonic
- YAMAHAのFM音源チップ、YMF825がMAKE市場向けに登場。Maker Faireで先行発売が決定だ! : 藤本健の“DTMステーション”

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