;******************************************************************************************
;  メロディーサンプル
;   Program Name : 
;   Programer    :
;   Create date  :  Version 1.0    H17.07.17
;   History      :
;******************************************************************************************
;      平均律音階
;        中心の“ラ”の音の周波数が440Hz,その1オクターブ低い“ラ”の音が220Hz
;        音階の周波数＝220×2^(n/12)  nは,1から12の整数
;          ド  :261.63Hz(191.11回) 41
;          レ  :293.66Hz(170.26回) 49
;          ミ  :329.63Hz(151.69回) 52
;          ファ:349.23Hz(143.17回) 57
;          ソ  :392   Hz(127.55回) 62
;          ラ  :440   Hz(113.63回) 6E
;          シ  :493.88Hz(101.24回) 7B
;          ド  :523.25Hz( 95.56回) 82
;       分周ループ回数
;          ソース周波数 / ターゲット周波数 / 2(ON,OFF)
;       プログラム
;         Step1) 100KHzを作る　4MHzなら40回分周、20MHzなら200回分周
;         Step2) 各音階を作る
;            例)ラ：100KHz / 440Hz / 2 => 113.63回
;******************************************************************************************
#DEFINE	PI_CLK	H'0D'		; OSC  20MHz
;====================== 以下はPIC16F88用の記述 ======================
;   20MHz動作
	LIST	P=PIC16F88
	INCLUDE	"P16F88.inc"	
	__CONFIG _CONFIG1 , _CP_OFF & _CCP1_RB0 & _DEBUG_OFF & _WRT_PROTECT_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC
	__CONFIG _CONFIG2 , _IESO_OFF & _FCMEN_OFF

PLYINP	EQU	20H
PLYNUM	EQU	21H
PLYLP	EQU	22H
PLYLP1	EQU	23H
PLYLP2	EQU	24H
	ORG	0
	GOTO	START
	ORG	4
	GOTO	START
START
	BANKSEL	PORTA	; PortAのBankを選択する(Bank0 ※PortBは0,2,3にあるので指定注意)
	CLRF	PORTA	; PortAの初期化
	CLRF	PORTB	; PortBの初期化
	BANKSEL	ANSEL	; ANSELのBankを選択する(Bank1)
	MOVLW	0x00	; 
	MOVWF	ANSEL	; Degital Inputに設定
	MOVLW	B'1100000'
	MOVWF	TRISA	; PortAのI/O設定
	MOVLW	B'0000000'
	MOVWF	TRISB	; PortAのI/O設定
	BANKSEL	PORTA	; PortAのBankを選択する(Bank0 ※PortBは0,2,3にあるので指定注意)
;
;====================== 以下はPIC16F819用の記述 ======================
;   20MHz動作
;	LIST	P=PIC16F819
;	INCLUDE	"P16F819.inc"	
;	__CONFIG _CP_OFF & _CCP1_RB2 & _DEBUG_ON & _WRT_ENABLE_OFF & _CPD_OFF & _LVP_OFF & _BODEN_OFF & _MCLR_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC
;
;PLYINP	EQU	20H
;PLYNUM	EQU	21H
;PLYLP	EQU	22H
;PLYLP1	EQU	23H
;PLYLP2	EQU	24H
;	ORG	0
;	GOTO	START
;	ORG	4
;	GOTO	START
;START
;	BANKSEL	PORTA	; PortAのBankを選択する(Bank0 ※PortBは0,2,3にあるので指定注意)
;	CLRF	PORTA	; PortAの初期化
;	CLRF	PORTB	; PortBの初期化
;	BANKSEL	ADCON1	; ADCON1のBankを選択する(Bank1)
;	MOVLW	0x06	; 
;	MOVWF	ADCON1	; Degital Inputに設定
;	MOVLW	B'1100000'
;	MOVWF	TRISA	; PortAのI/O設定
;	MOVLW	B'0000000'
;	MOVWF	TRISB	; PortAのI/O設定
;	BANKSEL	PORTA	; PortAのBankを選択する(Bank0 ※PortBは0,2,3にあるので指定注意)
;
;====================== 以下はPIC16F84Aの記述 ======================
;   20MHz動作
;	LIST	P=PIC16F84A,ST=OFF,R=DEC
;	INCLUDE	"P16F84A.inc"	
;	__CONFIG _CP_OFF & _PWRTE_OFF & _WDT_OFF & _HS_OSC
;
;PLYINP	EQU	0CH
;PLYNUM	EQU	0DH
;PLYLP	EQU	0EH
;PLYLP1	EQU	0FH
;PLYLP2	EQU	10H
;	ORG	0
;	GOTO	START
;	ORG	4
;	GOTO	START
;START
;	CLRF	PORTA			; PORT-Aをオール0
;	CLRF	PORTB			; PORT-Bをオール0
;	BSF	STATUS,	RP0		; バンク1へ
;	CLRF	TRISB			; PORT-Bを全て出力として設定
;	MOVLW	B'010000'		; PORT-AをRA4以外を出力として設定
;	MOVWF	TRISA			; RA.0を出力、RA.1を入力ポートへ
;	BCF	STATUS,	RP0		; バンク0へ
;
;=====================================================================
; 1.デモをならす
	CALL	DEMO1	; ドレミファソラシド・ドシラソファミレド	
	CALL	PLAYSP	; 休む
	CALL	PLAYSP	; 休む
	CALL	DEMO2	; 海
; ２.鍵盤にする
MAIN
	BTFSS	PORTB,0
	GOTO	MU1
	MOVLW	H'05'
	CALL	PLAY
	GOTO	MAIN
MU1
	BTFSS	PORTB,1
	GOTO	MU2
	MOVLW	H'06'
	CALL	PLAY
	GOTO	MAIN
MU2
	BTFSS	PORTB,2
	GOTO	MU3
	MOVLW	H'07'
	CALL	PLAY
	GOTO	MAIN
MU3
	BTFSS	PORTB,3
	GOTO	MU4
	MOVLW	H'08'
	CALL	PLAY
	GOTO	MAIN
MU4
	BTFSS	PORTB,4
	GOTO	MU5
	MOVLW	H'09'
	CALL	PLAY
	GOTO	MAIN
MU5
	BTFSS	PORTB,5
	GOTO	MU6
	MOVLW	H'0A'
	CALL	PLAY
	GOTO	MAIN
MU6
	BTFSS	PORTB,6
	GOTO	MU7
	MOVLW	H'0B'
	CALL	PLAY
	GOTO	MAIN
MU7
	BTFSS	PORTB,7
	GOTO	MU8
	MOVLW	H'0C'
	CALL	PLAY
	GOTO	MAIN
;
MU8
	GOTO	MAIN

;*******************************************************************************************
;   関数名    : DEMO1　　　　
;   機能      : DEMO1を鳴らす(ドレミファソラシド・ドシラソファミレド) 
;   引数      :
;   変数      :
;   注意      :
;*******************************************************************************************
DEMO1
	MOVLW	H'05'
	CALL	PLAY
;
	MOVLW	H'06'
	CALL	PLAY
;
	MOVLW	H'07'
	CALL	PLAY
;
	MOVLW	H'08'
	CALL	PLAY
;
	MOVLW	H'09'
	CALL	PLAY
;
	MOVLW	H'0A'
	CALL	PLAY
;
	MOVLW	H'0B'
	CALL	PLAY
;
	MOVLW	H'0C'
	CALL	PLAY
;
	CALL	PLAYSP
; 
	MOVLW	H'0C'
	CALL	PLAY
;
	MOVLW	H'0B'
	CALL	PLAY
;
	MOVLW	H'0A'
	CALL	PLAY
;
	MOVLW	H'09'
	CALL	PLAY
;
	MOVLW	H'08'
	CALL	PLAY
;
	MOVLW	H'07'
	CALL	PLAY
;
	MOVLW	H'06'
	CALL	PLAY
;
	MOVLW	H'05'
	CALL	PLAY

	RETURN

;*******************************************************************************************
;   関数名    : DEMO2　　　　
;   機能      : DEMO2を鳴らす(海) 
;   引数      :
;   変数      :
;   注意      :
;*******************************************************************************************
DEMO2
	MOVLW	H'0A'	;ラ
	CALL	PLAY
	MOVLW	H'0A'	;ラ
	CALL	PLAY
;
	MOVLW	H'09'	;ソ
	CALL	PLAY
	MOVLW	H'09'	;ソ
	CALL	PLAY
;
	MOVLW	H'08'	;ファ
	CALL	PLAY
	MOVLW	H'08'	;ファ
	CALL	PLAY
;
	MOVLW	H'06'	;レ
	CALL	PLAY
;
	MOVLW	H'09'	;ソ
	CALL	PLAY
;
	MOVLW	H'08'	;ファ
	CALL	PLAY
	MOVLW	H'08'	;ファ
	CALL	PLAY
;
	MOVLW	H'06'	;レ
	CALL	PLAY
	MOVLW	H'06'	;レ
	CALL	PLAY
;
;
	MOVLW	H'05'	;ド
	CALL	PLAY
;
	MOVLW	H'05'	;ド
	CALL	PLAY
;
	MOVLW	H'08'	;ファ
	CALL	PLAY
	MOVLW	H'08'	;ファ
	CALL	PLAY
;
	MOVLW	H'08'	;ファ
	CALL	PLAY
	MOVLW	H'08'	;ファ
	CALL	PLAY
;
	MOVLW	H'09'	;ソ
	CALL	PLAY
	MOVLW	H'09'	;ソ
	CALL	PLAY
	MOVLW	H'09'	;ソ
	CALL	PLAY
	MOVLW	H'09'	;ソ
	CALL	PLAY
;
	CALL	PLAYSP
	CALL	PLAYSP
	CALL	PLAYSP
	CALL	PLAYSP
;
	MOVLW	H'0A'	;ラ
	CALL	PLAY
	MOVLW	H'0A'	;ラ
	CALL	PLAY
;
	MOVLW	H'0A'	;ラ
	CALL	PLAY
	MOVLW	H'0A'	;ラ
	CALL	PLAY
;
	MOVLW	H'0C'	;ド
	CALL	PLAY
	MOVLW	H'0C'	;ド
	CALL	PLAY
;
	MOVLW	H'0A'	;ラ
	CALL	PLAY
;
	MOVLW	H'0A'	;ラ
	CALL	PLAY
;
	MOVLW	H'09'	;ソ
	CALL	PLAY
	MOVLW	H'09'	;ソ
	CALL	PLAY
;
	MOVLW	H'08'	;ファ
	CALL	PLAY
	MOVLW	H'08'	;ファ
	CALL	PLAY
;
	MOVLW	H'06'	;レ
	CALL	PLAY
;
	MOVLW	H'06'	;レ
	CALL	PLAY
;
	MOVLW	H'05'	;ド
	CALL	PLAY
	MOVLW	H'05'	;ド
	CALL	PLAY
;
	MOVLW	H'09'	;ソ
	CALL	PLAY
	MOVLW	H'09'	;ソ
	CALL	PLAY
;
	MOVLW	H'08'	;ファ
	CALL	PLAY
	MOVLW	H'08'	;ファ
	CALL	PLAY
	MOVLW	H'08'	;ファ
	CALL	PLAY
	MOVLW	H'08'	;ファ
	CALL	PLAY
;
	CALL	PLAYSP
	CALL	PLAYSP

	RETURN

;*******************************************************************************************
;   関数名    : PLAYSP　　
;   機能      : 休む 
;   引数      :
;   変数      :
;   注意      :
;*******************************************************************************************
PLAYSP
	BCF	PORTA,0
	MOVLW	H'BF'
	MOVWF	PLYLP2
PLYSP2
	MOVLW	H'41'
	MOVWF	PLYLP1
PLYSP1
	CALL	PLYWAT
	DECFSZ	PLYLP1,F
	GOTO	PLYSP1
	DECFSZ	PLYLP2,F
	GOTO	PLYSP2

	RETURN

;*******************************************************************************************
;   関数名    : PLAY　　
;   機能      : 鳴らす
;   引数      : Wレジスタ:ド5/レ6/ミ7/ファ8/ソ9/ラA/シB/ドC
;   変数      :
;   注意      :
;*******************************************************************************************
PLAY
	MOVWF	PLYINP
	CALL	PLYTBL
	MOVWF	PLYNUM
;
	MOVFW	PLYINP
	CALL	PLYTBL1
	MOVWF	PLYLP2
PLAY0
	BSF	PORTA,0
	MOVFW	PLYNUM
	MOVWF	PLYLP1
PLAY1
	CALL	PLYWAT
	DECFSZ	PLYLP1,F
	GOTO	PLAY1
;
	BCF	PORTA,0
	MOVFW	PLYNUM
	MOVWF	PLYLP1
PLAY2
	CALL	PLYWAT
	DECFSZ	PLYLP1,F
	GOTO	PLAY2
;
	DECFSZ	PLYLP2,F
	GOTO	PLAY0
;

	RETURN

PLYTBL			; 周波数分周変数
	ADDWF	PCL,F
	RETLW	H'FF'	;　ミ
	RETLW	H'FF'	;　ファ
	RETLW	H'FF'	;　ソ
	RETLW	H'FF'	;　ラ
	RETLW	H'FF'	;　シ
	RETLW	H'BF'	;　ド   191
	RETLW	H'AA'	;　レ   170
	RETLW	H'98'	;　ミ   152
	RETLW	H'8F'	;　ファ 143
	RETLW	H'80'	;　ソ   128
	RETLW	H'72'	;　ラ   114
	RETLW	H'65'	;　シ   101
	RETLW	H'60'	;　ド    96
	RETLW	H'FF'	;　レ
PLYTBL1			; ８分音符が鳴らす時間（0.25秒）
	ADDWF	PCL,F
	RETLW	H'FF'	;　ミ
	RETLW	H'FF'	;　ファ
	RETLW	H'FF'	;　ソ
	RETLW	H'FF'	;　ラ
	RETLW	H'FF'	;　シ
	RETLW	H'41'	;　ド   191
	RETLW	H'49'	;　レ   170
	RETLW	H'52'	;　ミ   152
	RETLW	H'57'	;　ファ 143
	RETLW	H'62'	;　ソ   128
	RETLW	H'6E'	;　ラ   114
	RETLW	H'7B'	;　シ   101
	RETLW	H'82'	;　ド    96
	RETLW	H'FF'	;　レ

;*******************************************************************************************
;   関数名    : PLYWAT　　
;   機能      : 100KHzを作成
;   引数      : 
;   変数      :
;   注意      :
;*******************************************************************************************
PLYWAT
	MOVLW	PI_CLK
	MOVWF	PLYLP
	BSF	PORTA,1

PLYWAT1
	DECFSZ	PLYLP,F
	GOTO	PLYWAT1
	BCF	PORTA,1

	RETURN


	END
