19
SAKURAボードユーザ会 西村備山 (@lipoyang) FM音源シールド for GR-SAKURA

FM音源シールド for GR-SAKURA

Embed Size (px)

Citation preview

Page 1: FM音源シールド for GR-SAKURA

SAKURAボードユーザ会

西村備山 (@lipoyang)

FM音源シールド for GR-SAKURA

Page 2: FM音源シールド for GR-SAKURA

自己紹介

西村備山 (@lipoyang)

■奈良県在住

■組込み系技術者(ソフト)

■OSレスからLinuxまで

■たいていCかC++

■ロボット製作が趣味

Page 3: FM音源シールド for GR-SAKURA

FM音源シールド for GR-SAKURA

Page 4: FM音源シールド for GR-SAKURA

YAMAHA YM2203

1980年代に一世を風靡したFM音源チップ

Page 5: FM音源シールド for GR-SAKURA

わずかなデータ量のパラメータで さまざまな楽器の音を合成できる

Page 6: FM音源シールド for GR-SAKURA

80年代のパソコンに広く採用

Page 7: FM音源シールド for GR-SAKURA

回路の設計

Page 8: FM音源シールド for GR-SAKURA

回路の設計

浮動小数点

DAC

Mix &

アンプ

4MHz マスタークロック

8ビット 外部メモリバス

リセット

割り込み (未使用)

GR-SAKURA YM2203

FM音源出力 (デジタル)

YM3014

オーディオ 出力

SSG音源出力 (アナログ×3ch)

Page 9: FM音源シールド for GR-SAKURA

GR-SAKURAのメモリバス

データバス D0-D7

A0

nWR

nRD

nCS3

Page 10: FM音源シールド for GR-SAKURA

スイッチサイエンス Arduino用バニラシールド基板

4カ所パターンカットすれば GR-SAKURAの拡張コネクタに

ピッタリ!

Page 11: FM音源シールド for GR-SAKURA

メモリバス

// read YM2203 status

#define YM2203_STATUS (*(volatile unsigned char*)0x05000000) // CS3,A16=0

// read YM2203 register address

#define YM2203_REG_ADDR (*(volatile unsigned char*)0x05000000) // CS3,A16=0

// read/write YM2203 register value

#define YM2203_REG_DATA (*(volatile unsigned char*)0x05010000) // CS3,A16=1

SYSTEM.SYSCR0.WORD = 0x5a03; // enable external bus

SYSTEM.SCKCR.BIT.BCK = 4; // BCLK 1/4 prescale

MPC.PWPR.BIT.B0WI = 0; // disable access protection

MPC.PWPR.BIT.PFSWE = 1; //

MPC.PFCSE.BIT.CS3E = 1; // enable CS3

MPC.PFCSS0.BIT.CS3S = 2; // set PC4 function as CS3

MPC.PFAOE1.BIT.A16E = 1; // enable A16

MPC.PFBCR0.BYTE = 0; // 8bit data bus, PCX as address bus

BSC.CS3CR.WORD = 0x0001 | (2 << 4); // 8bit data bus.

桜ライブラリにないので自力でレジスタ設定

Page 12: FM音源シールド for GR-SAKURA

マスタークロック(4MHz)

// set PC7 as MTIOC3A

MPC.PWPR.BIT.B0WI = 0;// disable access protection

MPC.PWPR.BIT.PFSWE = 1; //

MPC.PC7PFS.BIT.PSEL = 0x01; // set PC7 as MTIOC3A

MPC.PWPR.BIT.PFSWE = 0; // enable access protection again

MPC.PWPR.BIT.B0WI = 1;//

PORTC.PMR.BIT.B7 = 1;// use PC7 as peripheral

SYSTEM.PRCR.WORD = 0xA502;// disable access protection

MSTP(MTU) = 0;// enable MTU (MTU0-MTU5)

// stop and clear MTU3's TCNT

MTU.TSTR.BIT.CST3 = 0;

MTU3.TCNT = 0x0000;

MTU3.TCR.BIT.TPSC = 0;// counter clock: PCLK/1 = 48MHz

MTU3.TCR.BIT.CKEG = 0;// count on rising edge

MTU3.TCR.BIT.CCLR = 1;// clear TCNT on TGRA compare match

// PWM mode 1

MTU3.TMDR.BYTE = 0x02;

// set output level

MTU3.TIORH.BIT.IOA = 1; // initially output 0, output 0 on cycle compare match

MTU3.TIORH.BIT.IOB = 2; // output 1 on duty compare match

// set cycle and duty

MTU3.TGRA = 11; // cycle = 1/4MHz = 250ns(48MHz/12 =4MHz)

MTU3.TGRB = 5;// duty = cycle/2 = 125ns

// start MTU3's TCNT

MTU.TSTR.BIT.CST3 = 1;

MTU3で 4MHz, Duty 50% のパルスを発生

Page 13: FM音源シールド for GR-SAKURA

タイマ割り込み

// TMR0(8bit) + TMR1(8bit) cascaded 16bit timer mode

// TMR0: upper 8 bits / TMR1: lower 8 bits

SYSTEM.PRCR.WORD = 0xA50B; // enable writing to protected registers

MSTP(TMR01) = 0; // turn on TMR0,1

TMR0.TCCR.BIT.CSS = 0x03; // TMR0 clocked by TMR1 overflow

TMR1.TCCR.BIT.CSS = 0x01; // TMR1 clocked by PCLKB / prescaler

TMR1.TCCR.BIT.CKS = 0x04; // 1/64 prescaler for TMR1

// default BPM = 80 (80 quarter notes in 1 minute)

// interrupt interval = 1/8 * 32th note interval

// = 60sec / (BPM*8*8)

// compare match = 60 * 1,000,000us / (BPM*4*8) * (48MHz / 64)

TMR01.TCORA = (uint16_t)((60000000UL * 48) / (80*8*8*64));

TMR0.TCR.BIT.CCLR = 0x01;// set counter clear by compare match A

TMR0.TCR.BIT.CMIEA = 0x01;// enable compare match A interrupt

TMR01.TCNT = 0x0000;// clear the counter

IPR(TMR0, CMIA0) = 1;// set interrupt priority level

IEN(TMR0, CMIA0) = 1;// enable compare match A interrupt

TMR0+TMR1でタイマ割り込みを発生

Page 14: FM音源シールド for GR-SAKURA

多重割り込み

extern "C" void Excep_TMR0_CMIA0(void) __INTTERUPT_FUNC;

extern "C" void Excep_TMR0_CMIA0(void)

{

int i;

static int tgl=0;

// enable multiple interrupt

// setpsw_i(); // for Renesas CCRX

__builtin_rx_setpsw('I');// for GCC

i = 100;

// interval procedure for playing music

MMLplayer.onTimer();

// clear interrupt

IR(TMR0, CMIA0) = 0;

}

Page 15: FM音源シールド for GR-SAKURA

あれ?桜ライブラリは?

ほとんど使ってません

(´・ω・`)

Page 16: FM音源シールド for GR-SAKURA

制御ライブラリの設計

アプリ(スケッチ)

MMLパーサクラス

( YM2203_MMLplayer )

YM2203 タイマ

音色構造体

( YM2203_Timbre )

YM2203制御クラス

( YM2203 )

Page 17: FM音源シールド for GR-SAKURA

昔なつかしのMML

char *note1,*note2,*note3;

note1 = (char*)"L8Q7O4V14"

"DBAGD4RDDBAGE4REE>C<BAF+4R>DDDC<AB4RD"

"DBAGD4RDDBADE4REE>C<BA>DDDDEDC<AGR>D4";

note2 = (char*)"L8Q4O5V13"

"RRRRRD16C+16D16C+16DRRRRRE16D+16E16D+16E"

"RRRRRF+16F16F+16F16F+RRRRRD16D+16E16D+16D"

"RRRRRD16C+16D16C+16DRRRRRE16D+16E16D+16E"

"RRRRRF+16F16F+16F16F+RRRRRRD4";

note3 = (char*)"L8Q8O4V14"

"G4D4G4D4G4AB>C4<G4>C4<G4A4D4A4D4GDEF+"

"G4D4G4D4G4AB>C4<G4>C4<G4A4D4ADEF+G4D4";

MMLplayer.setNote(FM_CH1, note1);

MMLplayer.setNote(FM_CH2, note2);

MMLplayer.setNote(FM_CH3, note3);

楽譜を文字列で表現

Page 18: FM音源シールド for GR-SAKURA

今後の課題

■プリセット音色の整備

■Android端末との通信

■MIDI対応

■もっとPhysical Computing!

■NT京都2014

Page 19: FM音源シールド for GR-SAKURA

ご清聴ありがとうございました

ブログで公開&解説

滴了庵日録

http://d.hatena.ne.jp/licheng/

「FM音源」でブログ内検索