;******************************************************************************************
;  メロディーサンプル
;   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'01'		; OSC  1MHz
;====================== 以下はPIC12F683用の記述 ======================
;   1MHz動作
	LIST	P=PIC12F683 	;
	INCLUDE	"P12F683.inc"	;標準ヘッダ定義ファイル
	__CONFIG _MCLRE_OFF & _INTRC_OSC_NOCLKOUT & _WDT_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
	BCF	STATUS,RP0
	MOVLW	07H		; BANK0でデジタルIO設定(Comparator機能でポート設定)
	MOVWF	CMCON0		; BANK0でデジタルIO設定(Comparator機能でポート設定)
	CLRF	GPIO		; BANK0でポート初期化
	BSF	STATUS,RP0
	CLRF	ANSEL		; BANK1でデジタルIO初期化
	MOVLW	B'001000'	; BANK1でPORT設定
	MOVWF	TRISIO		; BANK1でPORT設定
	BCF	STATUS,RP0

MAIN
	CALL	DEMO1
	CALL	DEMO2
	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

	CALL	PLAYSP
	CALL	PLAYSP
	CALL	PLAYSP
	CALL	PLAYSP
	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
	CALL	PLAYSP
	CALL	PLAYSP
	
	RETURN


;*******************************************************************************************
;   関数名    : PLAYSP　　
;   機能      : 休む 
;   引数      :
;   変数      :
;   注意      :
;*******************************************************************************************
PLAYSP
	BCF	GPIO,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	GPIO,0
	MOVFW	PLYNUM
	MOVWF	PLYLP1
PLAY1
	CALL	PLYWAT
	DECFSZ	PLYLP1,F
	GOTO	PLAY1
;
	BCF	GPIO,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
PLYWAT1
	DECFSZ	PLYLP,F
	GOTO	PLYWAT1
	RETURN

	END
