電子オルゴール
ドイツ音階 | A | A# | B | C | C# | D | D# | E | F | F# | G | G# | A |
ラ | ラ# | シ | ド | ド# | レ | レ# | ミ | ファ | ファ# | ソ | ソ# | ラ | |
周波数 | 220.0 | 233.1 | 246.9 | 261.6 | 277.2 | 293.7 | 311.1 | 329.6 | 349.2 | 369.9 | 391.9 | 415.3 | 440.0 |
周波数比 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 | |
周期(mS) | 4.5 | 4.3 | 4.1 | 3.8 | 3.6 | 3.4 | 3.2 | 3.0 | 2.9 | 2.7 | 2.6 | 2.4 | 2.3 |
周期(16uS) | 284.1 | 268.1 | 253.1 | 238.9 | 225.5 | 212.8 | 200.9 | 189.6 | 179.0 | 169.0 | 159.5 | 150.5 | 142.0 |
;********************************************* ; PIC16F628 ; SOUND PLAYER v0.1 ; yokoie 2003.11.26作製 ; 2004.03.11更新 ;クロックは4MHz ;PWMを利用、出力はRB3/CCP1(9ピン) ;********************************************* LIST P=16F628, ST=OFF, R=DEC, F=INHX8M INCLUDE P16F628.INC ;Fuse(Config)のデータ ;__CONFIG _INTRC_OSC_NOCLKOUT & _MCLRE_ON & _LVP_OFF & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _CP_OFF ; 変数レジスタの定義 CNT1 EQU 0x70 ;タイマ用変数 CNT2 EQU 0x71 ;タイマ用変数 CNT3 EQU 0x72 ;タイマ用変数 CNT4 EQU 0x73 ; SNDCNT EQU 0x74 ;音符カウンタ ; メインルーチン ORG 0 ;Reset Start MAIN BSF STATUS,RP0 ;バンク1へ切替 MOVLW 0x03 ;Set PortA to Read Mode MOVWF TRISA MOVLW 0xB0 ;Set PortB to Read Mode MOVWF TRISB ;**** PWM モードの設定 **** MOVLW 0x6f ;PWMのパルス幅を188に MOVWF PR2 ;プリスケーラー設定 BCF STATUS,RP0 ;バンク0に戻す MOVLW 0CH ; MOVWF CCP1CON ;CCP1CONをPWMモードに設定 MOVLW 0x40 MOVWF CCPR1L ;PWMのデューティー設定 ;**** TIMER2 設定 **** MOVLW 0x06 ;TIMER2=ON プリスケーラー=1:1 MOVWF T2CON ;TIMER2をセット ;**** 音符カウンタリセット **** MOVLW 0x20 MOVWF SNDCNT ;演奏開始 MAINLP BCF STATUS, Z ;ゼロフラグクリア MOVF SNDCNT,W ;楽譜の位置 CALL BANK1 MOVWF EEADR ;アドレスをEEADRへセット BSF EECON1,RD ;楽譜読み出し開始 MOVF EEDATA,W ;Wレジスタにデータ取り出し CALL BANK0 XORLW 0xed ;0xedなら曲が終了 BTFSC STATUS, Z ; CALL RESTRT ;先頭に戻る CALL BANK1 MOVF EEDATA,W ;Wレジスタにデータ取り出し CALL BANK0 CALL SETSND ;音を出す INCF SNDCNT GOTO MAINLP RESTRT MOVLW 0x20 ;音符データの先頭に戻す MOVWF SNDCNT GOTO MAINLP ;再開 ;PWM周期設定 SETSND ;MOVF E_ADRS,W ;周波数データのアドレス指定 CALL BANK1 MOVWF EEADR ;アドレスをEEADRへセット BSF EECON1,RD ;読み出し設定 MOVF EEDATA,W ;Wレジスタにデータ取り出し CALL BANK1 MOVWF PR2 ;PWMの周期を設定 CALL BANK0 CALL TIM2 ;音符の長さだけ持続 RETURN STPSND BCF T2CON, 2 ;0出力 CALL TIM2 ;タイマー2 BSF T2CON, 2 ;1出力 RETURN ; タイマサブルーチン TIM1 MOVLW 0xff ;255 MOVWF CNT1 ; TIMLP1 CALL TIM2 DECFSZ CNT1,F ; GOTO TIMLP1 ; RETURN ; ;音符の時間待つ TIM2 MOVLW 0x40 ;音符の長さを設定 MOVWF CNT2 ;CNT2<=0x40 TIMLP2 CALL TIM3 ; DECFSZ CNT2,F ; GOTO TIMLP2 ; RETURN ; TIM3 MOVLW 0xff ;255 MOVWF CNT3 ; TIMLP3 CALL TIM4 DECFSZ CNT3,F ; GOTO TIMLP3 ; RETURN ; TIM4 MOVLW 0x01 ; MOVWF CNT4 ; TIMLP4 DECFSZ CNT4,F ; GOTO TIMLP4 ; RETURN ; ;バンク切り替え関数 BANK0 BCF STATUS, RP0 ;バンク0へ BCF STATUS, RP1 RETURN BANK1 BSF STATUS, RP0 ;バンク1へ BCF STATUS, RP1 RETURN ;EEPROM DATA ORG 02100H ;周波数データ DE 0, 0xeC, 0xDF, 0xd2, 0xc6, 0xbb, 0xb0, 0xa6, 0x9d, 0x94, 0x8c, DE 0x84, 0x7c, 0x73, 0x6e, 0x68 DE 0x62, 0x5c, 0x57, 0x52, 0x4d, 0 ;ここから楽譜を入力 ;データ番地と音階対応表 ; 0x01:ド 0x02:ド# 0x03:レ 0x04:レ# 0x05:ミ ; 0x06:ファ 0x07:ファ# 0x08:ソ 0x09:ソ# 0x0a:ラ ; 0x0b:ラ# 0x0c:シ 0x0d:ド↑ 0x0e:ド#↑ 0x0f:レ↑ ; 0x10:レ#↑ 0x11:ミ↑ 0x12:ファ↑ 0x13:ファ#↑ 0x14:ソ↑ ; 0x15:休符 ;曲の最後に0xedを入力してください。 ORG 02120H DE 0x14, 0x14, 0x11, 0x12, 0x14, 0x14, 0x11, 0x12 DE 0x14, 0x08, 0x0a, 0x0c, 0x0d, 0x0f, 0x11, 0x12 DE 0x11, 0x11, 0x0d, 0x0f, 0x11, 0x15, 0x05, 0x06 DE 0x08, 0x0a, 0x08, 0x06, 0x08, 0x05, 0x06, 0x08 DE 0x06, 0x06, 0x0a, 0x08, 0x06, 0x06, 0x05, 0x03 DE 0x05, 0x03, 0x01, 0x03, 0x05, 0x06, 0x08, 0x0a DE 0x06, 0x06, 0x0a, 0x08, 0x0a, 0x0a, 0x0c, 0x0d DE 0x08, 0x0a, 0x0c, 0x0d, 0x0f, 0x11, 0x12, 0x14 DE 0xed END