導航:首頁 > 操作系統 > 單片機音樂節拍旋律提取

單片機音樂節拍旋律提取

發布時間:2022-05-26 16:22:30

單片機播放音樂里的音樂代碼是怎麼得到的有什麼軟體能將歌曲直接轉換成16進制代碼

把簡譜中每個唱名對應的頻率找出來,比如C調的1對應264Hz左右。
然後把這些頻率通過公式轉換成初值再換算成十六進制。
比如你用的是定時的工作方式1,則可以這位算:(假設晶振是12MHz)
X=2^16-10^6/(264*2)=63642因為要計算的是半周期對應的初值,所以頻率就是2倍。
十六進制就是:F89A
好像沒有什麼軟體吧,有的話告訴我一聲哦。

⑵ 在單片機中怎麼確定音樂節拍

這種LED隨音樂閃爍,效果上類似於音響設備的電平指示器。電路很多,可用分立元件,也可用現成的IC,如日本東芝公司早期的TA7666B等,如圖所示:此圖可接21隻LED,排成往兩邊閃的效果,中間一隻LED長亮,作為電源指示。輸入端接音頻信號,信號弱,LED閃的少,信號強,LED閃的多,直至閃到頭。

⑶ 這些單片機代碼根據曲譜怎麼寫出來的,求大神詳細教啊!

哈哈,LZ有求知慾很好嘛!其實原理是這樣的:
首先,音樂有哪幾個最基本的要素?
1,音高(頻率) 2,節拍(音符長度)3,強度。

其次,單片機演奏音樂的原理?
1,硬體方面:以I/o口輸出方波,驅動無源蜂鳴器震動,方波頻率與樂譜中音符的頻率對應(實現了音樂的第1要素)
2,軟體方面,有兩點
(1)如何產生某一頻率的方波?通過定時器產生周期性中斷,在中斷里將IO口的電平翻轉即可,中斷周期(即定時器應賦的初值)可以由需要的頻率計算得到。
(2)如何控制音符的長度(即音樂的第2要素)?從程序結構上來講,有幾種實現途徑,我能想到的:再使用一個定時器,它的中斷周期固定,以它作為長度的基準。比如,定為10ms中斷一次,中斷100次就是1秒,那麼演奏節拍為2/4拍一分鍾60拍的二分音符小字一組A(440Hz),就是200次中斷。定時器0控制I/O口輸出頻率440Hz的方波,並等定時器1中斷 200次之後,就切換到下一音符。這樣就實現了樂音輸出。
3.當然,這樣的音樂是控制不了強弱的,無法實現音樂的要素3。非常簡陋,只能將就。

程序最下面的數組就是單片機的「樂譜」,每一對元素,前面是音高(對應的宏給其對應的在音階里的位置進行了編號,後面是音符長度)。m_note數組存儲的就是演奏某一頻率的樂音對應的定時器中斷周期。

⑷ 單片機對於音樂的編程中 ,音符的十六位數據表是怎樣

只有音樂發聲匯編程序,沒有加入LED燈,供參考。數據代碼已改為小星星發聲
;**********************************************
ORG 0000H
SJMP MAIN
ORG 0BH
AJMP TIME0

;*************主程序************************

MAIN: MOV SP,#60
MOV TMOD,#01H ;T0定時工作方式
MOV IE,#82H ;CPU 中斷允許,T0中斷允許

START0: MOV 30H,#00H ;TABLE 相對地址指針
NEXT: MOV A,30H
MOV DPTR,#TABLE ;到TABLE處取 簡譜碼 節拍 碼
MOVC A,@A+DPTR
MOV R2,A ;取到的簡譜碼 節拍碼 暫存於R2中

JZ ENDF ;取到 00 結束

ANL A,#0FH ;否,取低四位 節拍 碼
MOV R5,A ;將節拍碼存於R5中
MOV A,R2 ;簡譜碼 節拍 碼 給A
SWAP A ;高4位 與 低4位 交換
ANL A,#0FH ;取簡譜 碼
JNZ SING ;取到的簡譜 碼不是0,則去發聲
CLR TR0 ;取到0 則不發聲
SJMP DLY1 ;節拍延時子程序( 隨節拍碼變化,延時時間不同)

;---------------發聲-----------------------
SING: DEC A ;取到的簡譜碼減1
;(簡譜碼計數值16位數據存儲首地址從TABLE1 《相對地址》0處開始放起,所以要減1)
MOV 22H,A ;存入(22H)中
RL A ;乘2 因為取的數據占兩位元組(16位)
;所以指針增加量要乘2

MOV DPTR,#TABLE1
;...........簡譜碼轉換為相應定時器16位計數值.............
MOVC A,@A+DPTR ;到TABLE1取相應的高位元組計數值
MOV TH0,A ;高位元組計數值存入TH0和(21H)中
MOV 21H,A
MOV A,22H ;減1的簡譜碼給A
RL A ;乘2 因為取的數據占兩位元組(16位)
;所以指針增加量要乘2
INC A ;A 增加 取下一個位元組計數值

;...........簡譜碼轉換為相應定時器16位計數值.............
MOVC A,@A+DPTR ;到TABLE1取相應的低位元組計數值
MOV TL0,A ;低位元組計數值存入TL0和(20H)中
MOV 20H,A
SETB TR0 ;啟動T0定時器讓喇叭發出不同頻率聲音

;---------------節拍延時-------------------
DLY1: ACALL DELAY ;基本單位時間為1/4拍 187ms
INC 30H ;取下一個簡譜碼 節拍 碼
SJMP NEXT

;---------------歌放完結束---------------
ENDF: CLR TR0 ;關閉T0定時器
AJMP START0 ;反復循環

;****T0中斷子程序(用來驅動喇叭發出不同頻率聲音)**************
TIME0: PUSH ACC
PUSH PSW
MOV TL0,20H ;重裝計數值
MOV TH0,21H
CPL P3.7 ;驅動發聲
POP PSW
POP ACC
RETI

;******************節拍延時187ms****************************
DELAY: MOV R7,#187 ;187ms延時子程序
DLY2: MOV R4,#02
DLY3: MOV R3,#248
DJNZ R3,$
DJNZ R4,DLY3
DJNZ R7,DLY2
DJNZ R5,DELAY
RET

;*******音符T值表(用來讓定時器發出不同的頻率)**DW 表示一個 計數值 占兩個位元組存儲單元***************

TABLE1: DW 64260,64400,64524,64580,64684 ;低音SO 低音LA 低音SI /中音DO 中音RE
DW 64777,64820,64898,64968,65030 ;中音MI 中音FA 中音SO 中音LA 中音SI
DW 65058,65110,65157,65178,65217 ;高音DO 高音RE 高音MI 高音FA 高音SO

;*********簡譜碼 節拍碼(高4位簡譜碼 ,低4位節拍碼)*************

TABLE: DB 44H,44H,84H,84H ; 1 1 5 5
DB 094H,094H,88h ; 6 6 5 -

DB 74H,74H,63H,63H ; 4 4 3 3
DB 52H,52H,48h ; 2 2 1-

DB 84H,84H,74H,74H ; 5 5 4 4
DB 64H,64H,58h ; 3 3 2-

DB 84H,84H,74H,74H ; 5 5 4 4
DB 64H,64H,58h ; 3 3 2-

DB 44H,44H,84H,84H ; 1 1 5 5
DB 094H,094H,88h ; 6 6 5 -

DB 74H,74H,63H,63H ; 4 4 3 3
DB 52H,52H,48h ; 2 2 1-

END

加入了LED燈,水平有限,效果有點不太好
;**********************************************
ORG 0000H
SJMP MAIN
ORG 0BH
AJMP TIME0

;*************主程序************************

MAIN: MOV SP,#60
MOV TMOD,#01H ;TO定時工作方式
MOV IE,#82H ;CPU 中斷允許,TO中斷允許

START0: MOV 30H,#00H ;TABLE 相對地址指針
NEXT: MOV A,30H
MOV DPTR,#TABLE ;到TABLE處取 簡譜碼 節拍 碼
MOVC A,@A+DPTR
MOV R2,A ;取到的簡譜碼 節拍碼 暫存於R2中

JZ ENDF ;取到 00 結束

ANL A,#0FH ;否,取低四位 節拍 碼
MOV R5,A ;將節拍碼存於R5中
MOV A,R2 ;簡譜碼 節拍 碼 給A
SWAP A ;高4位 與 低4位 交換
ANL A,#0FH ;取簡譜 碼
JNZ SING ;取到的簡譜 碼不是0,則去發聲
CLR TR0 ;取到0 則不發聲
SJMP DLY1 ;節拍延時子程序( 隨節拍碼變化,延時時間不同)

;---------------發聲-----------------------
SING: DEC A ;取到的簡譜碼減1
;(簡譜碼計數值16位數據存儲首地址從TABLE1 《相對地址》0處開始放起,所以要減1)
MOV 22H,A ;存入(22H)中
RL A ;乘2 因為取的數據占兩位元組(16位)
;所以指針增加量要乘2

MOV DPTR,#TABLE1
;...........簡譜碼轉換為相應定時器16位計數值.............
MOVC A,@A+DPTR ;到TABLE1取相應的高位元組計數值
MOV TH0,A ;高位元組計數值存入TH0和(21H)中
MOV 21H,A
MOV A,22H ;減1的簡譜碼給A
RL A ;乘2 因為取的數據占兩位元組(16位)
;所以指針增加量要乘2
INC A ;A 增加 取下一個位元組計數值

;...........簡譜碼轉換為相應定時器16位計數值.............
MOVC A,@A+DPTR ;到TABLE1取相應的低位元組計數值
MOV TL0,A ;低位元組計數值存入TL0和(20H)中
MOV 20H,A
SETB TR0 ;啟動T0定時器讓喇叭發出不同頻率聲音

;---------------節拍延時-------------------
DLY1: ACALL DELAY ;基本單位時間為1/4拍 187ms
INC 30H ;取下一個簡譜碼 節拍 碼

CPL P1.0 LED燈 閃爍
CPL P1.1
CPL P1.2
CPL P1.3
CPL P1.4
CPL P1.5
CPL P1.6
CPL P1.7

SJMP NEXT

;---------------歌放完結束---------------
ENDF: CLR TR0 ;關閉T0定時器
AJMP START0 ;反復循環

;****T0中斷子程序(用來驅動喇叭發出不同頻率聲音)**************
TIME0: PUSH ACC
PUSH PSW
MOV TL0,20H ;重裝計數值
MOV TH0,21H
CPL P3.7 ;驅動發聲
POP PSW
POP ACC
RETI

;******************節拍延時187ms****************************
DELAY: MOV R7,#187 ;187ms延時子程序
DLY2: MOV R4,#02
DLY3: MOV R3,#248
DJNZ R3,$
DJNZ R4,DLY3
DJNZ R7,DLY2
DJNZ R5,DELAY
RET

;*******音符T值表(用來讓定時器發出不同的頻率)**DW 表示一個 計數值 占兩個位元組存儲單元***************

TABLE1: DW 64260,64400,64524,64580,64684 ;低音SO 低音LA 低音SI /中音DO 中音RE
DW 64777,64820,64898,64968,65030 ;中音MI 中音FA 中音SO 中音LA 中音SI
DW 65058,65110,65157,65178,65217 ;高音DO 高音RE 高音MI 高音FA 高音SO

;*********簡譜碼 節拍碼(高位簡譜碼 ,低位節拍碼)*************

TABLE: DB 44H,44H,84H,84H ; 1 1 5 5
DB 094H,094H,88h ; 6 6 5 - -表示有節拍

DB 74H,74H,63H,63H ; 4 4 3 3
DB 52H,52H,48h ; 2 2 1-

DB 84H,84H,74H,74H ; 5 5 4 4
DB 64H,64H,58h ; 3 3 2-

DB 84H,84H,74H,74H ; 5 5 4 4
DB 64H,64H,58h ; 3 3 2-

DB 44H,44H,84H,84H ; 1 1 5 5
DB 094H,094H,88h ; 6 6 5 -

DB 74H,74H,63H,63H ; 4 4 3 3
DB 52H,52H,48h ; 2 2 1-

END

⑸ 單片機,用一個蜂鳴器可以演奏出音樂嗎

當然可以了,以下是蘭花草的音樂播放程序,你可聽聽看。
我用Proteus模擬過了,可行。你也可以試試看。
SPK EQU P1.2 ;位定義
ORG 0
LJMP START
ORG 0030H ;偽指令,指定程序從0030H開始存放
START:
MOV R3,#00H ;R3清零(作為查表偏移)
NEXT: MOV A,R3
MOV DPTR,#TABLE ;查表
MOVC A,@A+DPTR
JZ START ;如果A是0就重來
MOV R7,A ;R7是查表的來的代碼位元組
INC R3 ;讀下一個代碼位元組
MOV A,R3
MOVC A,@A+DPTR
MOV R2,A
ACALL SONG
INC R3
SJMP NEXT;歌曲播放子程序
SONG:
MOV A,R2 ;取出節拍
RL A ;左移節拍
JNZ KEEP ;如果節拍為0就讓它等於1
MOV A,#01H
KEEP:
MOV R2,A
REPEAT:
ACALL EIGHTH
DJNZ R2,REPEAT
RET;產生1/8拍延時子程序
EIGHTH: MOV A,R7 ;查表取出廷時參數,保存到R4
MOV DPTR,#DELAY_T
MOVC A,@A+DPTR
MOV R4,A
MOV A,R7 ;查表取出1/8拍周期數,保存到R5
MOV DPTR,#S_PARA
MOVC A,@A+DPTR
MOV R5,A
NEXTCYC:
ACALL SOUND
DJNZ R5,NEXTCYC
RET
;=== 發聲子程序 ===
SOUND: SETB SPK
ACALL SDELAY
CLR SPK
ACALL SDELAY
RET;延時子程序
SDELAY: MOV A,R4 ; 廷時值在R4內
MOV R0,A
XL2: MOV R1,#03H
DL1: NOP
DJNZ R1,DL1
DJNZ R0,XL2
RET
;1/8拍周期表
S_PARA:DS 1DH
DB 15H,16H,00
DB 19H,00H,1CH,00H,1FH,21H,00H,25H
DB 00H,29H,2CH,00H,31H,34H,37H,00H
DB 3EH,41H,00H,49H,00H,52H,57H,00H
DB 62H
;延時參數表
DELAY_T:DS 1DH
DB 7EH,77H,00H
DB 6AH,00H,5EH,00H,54H,4FH,00H,46H
DB 00H,3FH,3BH,00H,35H,32H,2FH,00H
DB 2AH,27H,00H,23H,00H,1FH,1DH,0C0H
DB 1AH
;歌曲表
TABLE:DW 2202H,2902H,2902H,2902H,2906H,2702H ;我從山中來
DW 2502H,2702H,2502H,2402H,2208H ;帶著蘭花草
DW 2E02H,2E02H,2E02H,2E02H,2E06H,2C02H ;種在小園中
DW 2902H,2C02H,2D02H,2A02H,2908H ;祈禱花開早
DW 2902H,2E02H,2E02H,2C02H,2906H,2702H ;一日看三回
DW 2502H,2702H,2502H,2402H,2206H,1D02H ;看得花時過
DW 1D02H,2502H,2502H,2402H,2206H,2902H ;蘭花卻依然
DW 2702H,2502H,2402H,2002H,2208H ;苞也無一個
DW 0000H
END

⑹ 單片機音樂編程

<單片機音樂程序的設計圖>

硬體連接說明:

隨便找一個模擬機或者什麼單片機實驗板,只要能工作的就行,將程序輸入,運行,然後找個音箱(你計算機旁邊應當就有一對吧)撥出插頭,插頭的前端接在P1.0上,後面部分找根線接單片機的地,就應當有聲了,然後怎麼改進硬體連接就是你的事了....

音樂程序匯編代碼代碼1 -------------Voice.asm--------------------------

ORG 0000H
LJMP START
ORG 000BH
INC 20H ;中斷服務,中斷計數器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中斷
RETI
START:
MOV SP,#50H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE,#82H
MUSIC0:
NOP
MOV DPTR,#DAT ;表頭地址送DPTR
MOV 20H,#00H ;中斷計數器清0
MOV B,#00H ;表序號清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR ;查表取代碼
JZ END0 ;是00H,則結束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取節拍代碼送R7
MOV R7,A
SETB TR0 ;啟動計數
MUSIC2:
NOP
CPL P1.0
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中斷計數器(20H)=R7否?
;不等,則繼續循環
MOV 20H,#00H ;等於,則取下一代碼
INC DPTR
; INC B
LJMP MUSIC1
MUSIC3:
NOP
CLR TR0 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#64H ;歌曲結束,延時1秒後繼續
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP
DAT:
db 26h,20h,20h,20h,20h,20h,26h,10h,20h,10h,20h,80h,26h,20h,30h,20h
db 30h,20h,39h,10h,30h,10h,30h,80h,26h,20h,20h,20h,20h,20h,1ch,20h
db 20h,80h,2bh,20h,26h,20h,20h,20h,2bh,10h,26h,10h,2bh,80h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,60h,40h,10h,39h,10h,26h,20h
db 30h,20h,30h,20h,39h,10h,26h,10h,26h,80h,26h,20h,2bh,10h,2bh,10h
db 2bh,20h,30h,10h,39h,10h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,20h
db 20h,10h,20h,10h,2bh,10h,26h,30h,30h,80h,18h,20h,18h,20h,26h,20h
db 20h,20h,20h,40h,26h,20h,2bh,20h,30h,20h,30h,20h,1ch,20h,20h,20h
db 20h,80h,1ch,20h,1ch,20h,1ch,20h,30h,20h,30h,60h,39h,10h,30h,10h
db 20h,20h,2bh,10h,26h,10h,2bh,10h,26h,10h,26h,10h,2bh,10h,2bh,80h
db 18h,20h,18h,20h,26h,20h,20h,20h,20h,60h,26h,10h,2bh,20h,30h,20h
db 30h,20h,1ch,20h,20h,20h,20h,80h,26h,20h,30h,10h,30h,10h,30h,20h
db 39h,20h,26h,10h,2bh,10h,2bh,20h,2bh,40h,40h,10h,40h,10h,20h,10h
db 20h,10h,2bh,10h,26h,30h,30h,80h,00H

END

音樂程序匯編代碼代碼2 -------------Voice1.asm--------------------------

;標題 '八月桂花香'發聲程序
;摘要 詳見'無線電'92年3期
;作者 周振安
ORG 0000H
LJMP START
ORG 000BH
INC 20H ;中斷服務,中斷計數器加1
MOV TH0,#0D8H
MOV TL0,#0EFH ;12M晶振,形成10毫秒中斷
RETI
START:
MOV SP,#50H
MOV TH0,#0D8H
MOV TL0,#0EFH
MOV TMOD,#01H
MOV IE,#82H
MUSIC0:
NOP
MOV DPTR,#DAT ;表頭地址送DPTR
MOV 20H,#00H ;中斷計數器清0
MOV B,#00H ;表序號清0
MUSIC1:
NOP
CLR A
MOVC A,@A+DPTR ;查表取代碼
JZ END0 ;是00H,則結束
CJNE A,#0FFH,MUSIC5
LJMP MUSIC3
MUSIC5:
NOP
MOV R6,A
INC DPTR
MOV A,B
MOVC A,@A+DPTR ;取節拍代碼送R7
MOV R7,A
SETB TR0 ;啟動計數
MUSIC2:
NOP
CPL P1.0
MOV A,R6
MOV R3,A
LCALL DEL
MOV A,R7
CJNE A,20H,MUSIC2 ;中斷計數器(20H)=R7否?
;不等,則繼續循環
MOV 20H,#00H ;等於,則取下一代碼
INC DPTR
; INC B
LJMP MUSIC1
MUSIC3:
NOP
CLR TR0 ;休止100毫秒
MOV R2,#0DH
MUSIC4:
NOP
MOV R3,#0FFH
LCALL DEL
DJNZ R2,MUSIC4
INC DPTR
LJMP MUSIC1
END0:
NOP
MOV R2,#64H ;歌曲結束,延時1秒後繼續
MUSIC6:
MOV R3,#00H
LCALL DEL
DJNZ R2,MUSIC6
LJMP MUSIC0
DEL:
NOP
DEL3:
MOV R4,#02H
DEL4:
NOP
DJNZ R4,DEL4
NOP
DJNZ R3,DEL3
RET
NOP

⑺ 如何確定單片機音樂播放的音律和節拍計算

你是想用單片機編程,來播放曲子是吧。那往下看:
1.確定每一拍的時間,一般是一分鍾多少拍,確定一拍的時間是多少秒,確定每個音符的音長。
2.每個音符的音高,用十二平均律確定音高就可了。下面是音高與頻率的對應關系。
http://wenku..com/view/e1f7a551f01dc281e53af02a.html
紅色的部分是middle C的頻率。
3.音色選擇,也就是樂器的選擇,這個比較復雜,很難說清楚,如果這方面有問題,可給我發消息。先用c語言的beep函數試著編寫一下。

⑻ 想做個單片機音樂頻譜 但是我不知道如何從聲音中提取出各個頻點的大小 本人高一 太難的演算法有可能看

只能用傅立葉變換,求頻譜。

這演算法,比較復雜,普通的單片機,難做。

⑼ 如何將音樂中的節拍提取出來

用節拍器 .
那個比較准
可以在電腦下載
也可以用錢買.平均80元/個

⑽ 51單片機音律和節拍是怎麼送到P2.0口的

51單片機產生音樂的原理是每個節拍的持續時間內,將定時的定時時間設為周期的一半,定時器時間到就產生中斷,將P2.0口的狀態取反一次。例如,聲音頻率是1KHZ,周期是1ms,定時500us就可以了 。由於音樂的頻率是有規律的,可以將不同的音符的定時器初值製成表格,主程序根據樂譜內容查表,即可得到頻率有規律的方波,推動揚聲器發聲即可。

閱讀全文

與單片機音樂節拍旋律提取相關的資料

熱點內容
給手機加密碼忘記了怎麼辦 瀏覽:596
單片機運算符 瀏覽:292
移動端微信商城源碼 瀏覽:442
編程貓下一個背景在哪裡 瀏覽:354
javaclasstype 瀏覽:234
樂高編程和樂高課的延伸 瀏覽:354
蘋果手機怎麼切換app美國賬號 瀏覽:861
編譯程序輸入一個字元串 瀏覽:407
圓命令畫法 瀏覽:308
如果給電腦e盤文件加密 瀏覽:801
javaswing項目 瀏覽:778
androidsdksetup 瀏覽:1005
pdf怎麼設置中文 瀏覽:128
安卓手機用什麼軟體看倫敦金 瀏覽:966
魅族文件夾無名稱 瀏覽:792
蘇黎世無人機演算法 瀏覽:876
核桃編程和小碼王的融資 瀏覽:686
微積分教材pdf 瀏覽:728
寫python給微信好友發消息 瀏覽:340
蚊帳自營米加密 瀏覽:422