注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

是直到最后都无法放手的一种气息,是我们生命中最后的思念……

 
 
 

日志

 
 

FC音乐编写研究-摘文  

2009-01-09 13:21:19|  分类: FC知识整理 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

《电脑游戏机硬件与编程特技》(之音乐研究)

下面均为引用本书。抄者为能直接生成NES文件,将部分Fbasic改写成Nbasic,读者请参照原本读。

59(PDF63)

 

2.3  6527CPU的音响系统

 

任天堂游戏中美妙动听的音响来自6527CPU内部的PSG(Programmable Sound Generator)---可编程音响发生器。其主要特点为:

。五个声部发声:三个主声部、两个副声部;

15级音量调节;

15种音色选择;

15种音形包络;

8种包络周期;

4096种音调。

以上六大特点表明了6527CPU音响系统的发音功能是十分强大的。只要对发声软开关设置恰当的数值就可以模拟出各种的音响。众所周知,《魂斗罗》二代游戏专门设置了音乐欣赏密码开关,只要选中密码便可欣赏游戏中的全部音响。实际上,这些音响我们都可以在电脑游戏机中通过设置发声软开关模仿出来。

    强大的发音功能、简单的发音操作是6527CPU优于其它CPU的又一显著特点。

 

231 发声软开关简介

6527CPU的音响发声软开关位于CPU I/O区的$4000~$401320个单元,由它们组成5个发声声部,每个声部占用4个单元。其分配顺序如下:

。第一主声部:$4000~$4003

。第二主声部:$4004~$4007

。第三主声部:$4008~$400B

。第一副声部:$400C~$400F

。第二副声部:$4010~$4013

各声部对应单元的功能相同。下面仅以第一主声部为例介绍软开关的作用。

 

1、音色音量控制软开关$4000

$4000是第一主声部的音色、音量控制软开关,各位功能如图2-22

 FC音乐编写研究-摘文 - 维京人 - 深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

D0~D3:为15级音量控制软开关。其值为0时关闭音量;为1时音量最小;为15时音量最大。

D4~D7:为音色控制软开关。其中D4=1时发声时间延长;D5=1时可发出各段衰减音;D6=1时将缩短发声时间。

 

2、包络控制软开关$4001

$4001是第一主声部音形包络控制软开关。各位功能如图2-23

FC音乐编写研究-摘文 - 维京人 - 深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

 

 

。D7:为包络开关位。D7=1时包络有效。

。D4~D6:为8级包络周期控制开关。调整它们的取值,可模拟声差极大的效果音响。它们与$4000的D5位配合可发出多级衰减音。

。D0~D3:为15种包络形状控制开关,取值范围0~15。当取值等于0和等于8时无包络,发平直音;当取值等于1~7时,发音频率从高到低变化;当取值等于9~15时,发声频率则从低到高。当取值等于1、9时发声时间最短;取值等到于7、15时发声时间最长。

 

3、音调细调控制软开关$4002

$4002是第一主声部音调细调控制软开关。使用它可以细调发声音调,取值范围0~255,取值越大发声频率越低。

 

4、音调粗调控制软开关$4003

$4003是第一主声部音调粗调开关。合用它可以粗调发声音调,取值范围0~15,取值越大频率越低。

 

5、发声开关组$4015

$4015是启动发声控制开关组,写入不同的数据,可选择不同的发声声部。各位控制功能见图2-24。

FC音乐编写研究-摘文 - 维京人 - 深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

 

 

根据图2-24,向不同位置值可方便地控制各声部发声。置入1接通开关;置入0则关闭开关。

 

2.3.2 发声方法及控制程序

一、 发声方法

6527CPU的发声方法就是对不同的声部单元置入不同的数值。置数顺序一般为:

1、  接通发声开关,做好发声准备。一般对$4015单元置入FFH,接通五个声部的发声开关。若不需要哪一声部发声时,可把其对应位置入0。

2、  对包络开关单元、音调控制开关单元置入音色音量数据,以确定发声音调。

3、  最后对音色、音量控制开关单元置入音色音量数据,就可启动发声。这时,程序可转向处理其它事务,只要不对$4015写入0或对发声声部的音量单元写入0,发声可一直持续下去。

 

二、发声控制程序

1、控制发声的原理程序

控制发声的机器语言程序见No.2-24。

No.2-24

LDA #$FF

STA $4015     ;打开发声开关,准备发声

LDA #$B1

STA $4001     ;第一主声部包络数据

LDA #$C1

STA $4002     ;第一主声部音调细调

LDA #$D1

STA $4003     ;第一主声部音调粗调

LDA #$A1

STA $4000     ;第一主声部音色音量

LDA #$B2

STA $4005

LDA #C2

STA $4006

LDA #$D2

STA $4007

LDA #$A2

STA $4004     ;第二主声部数据

LDA #$B3      ;以后各声部数据

……

RTS

2 FBASIC 发声程序

(略,抄者改成NBasic)No.2-26

set $4015 $FF

set $4000 xa

set $4001 xb

set $4002 xc

set $4003 cd

输入程序No.2-26,按表2-10填入xa、xb、xc、xd发声参数,就可模拟出不同的效果音。

表2-10 第一主声部效果音发声数据

 

效果音响

xa

xb

xc

xd

效果音响

xa

xb

xc

xd

被枪击中

1F

81

EF

08

八级升调衰减音

2F

DF

EF

08

飞机降落

1F

96

EF

08

十级升调衰减音

2F

EF

EF

08

子弹射到金属上

1F

89

EF

08

十一级升调衰减

2F

FF

EF

08

射击声

1F

8B

EF

08

长升调音

3F

BF

EF

08

七宝奇谋进小屋

1F

FA

EF

08

三级降调衰减音

AF

F4

EF

08

警报

FF

FF

FF

FF

五级降调衰减音

AF

F5

EF

08

铃声

AF

C0

EF

08

十级降调衰减音

AF

F6

EF

08

四级升调衰减音

2F

BE

EF

08

廿级降调衰减音

AF

F7

EF

08

六级升调衰减音

2F

BF

EF

08

合卡箭头移动声

1F

99

EF

08

七级升调衰减音

2F

CF

EF

08

合卡节目换页声

1F

AA

EF

08

 

 

 

 

3、火车运行声音模拟

使用第一副声部可以惟妙惟肖、十分逼真地模拟出火车运行中的各种声响,其中有火车上坡、下坡的加速、减速声、火车钻入山洞的回声、火车过桥梁时的隆隆声,还有火车走远的渐弱声和火车开近的渐强声等。程序No.2-27仅仅数行程序就能产生如此奇妙的效果,不能不令人对6527CPU的发声能力惊叹咋舌。下面列出程序清单供朋友们欣赏。

(改成NBasic)

set rnd_1 $AA        //这个随意取一个

set ax 10

start_sound:

set xb 33

set $4015 8

set $400F $80

set $400C xb

set $400D $FF

set $400E xa

gosub rnd              //自己写一个随机数生成过程,用rnd_1为输入随机种子,也以它输出

set mod1 rnd_1

set mod2 100

gosub div_mod      //带余除法,(mod1=mod2*div1+r) 最后set mod1 r

set t1 + mod1 150

mark01:

gosub vwait           //过一次垂直消隐,不知pause 1是多长时间,这里可用数次vwait

//也可改用中断次数,假设pause 1为一次中断

dec t1

if t1<>0 goto mark01

inc xa

if xa=250 goto mark02

goto mark03

mark02:

gosub rnd

set mod1 rnd_1

set mod2 30

gosub div_mod

set xa + mod1 10

mark03:

if xa > 200 inc xb

if xb >47 goto mark04

goto mark05

mark04:

gosub rnd

set mod1 rnd_1

set mod2 5

gosub div_mod

set xa + mod1 33

mark05:

goto start_sound

 

 

1、  音乐旋律的演奏

以上仅介绍了各种效果音的发声方法,下面讨论音乐旋律的演奏。

6527CPU可发出6个8度音域共72个音阶(  包括半音)。因此。几乎可以演奏常见的各种音乐旋律。

演奏时,当音乐选定后,音符的变化就是改变音调单元的数据,音符与音调的对应关系见表2-11。

 FC音乐编写研究-摘文 - 维京人 - 深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

 清淅图见:  http://nicotine.knight.blog.163.com/editPhoto.do?photoId=fks_087065082086080071085086081067072084087074086080087066086&albumId=fks_087064087082089064092095085095086080088065082087087065

关于音符时值的控制(发声音长),我们不必像苹果机、中华学习机那样采用延时的方法进行控制(那样不仅降低了CPU的工作效率,而且也无法做到声、像同步),而是通过设置计数器的方法实现的,一般放在中断程序中进行处理。由于6527CPU的中断频率为50Hz,中断间隔为0.02秒,因此使用中断次数控制音长,可准确地控制音符的时值。在实际演奏中,音长、音量、音调各数值都是通过查表法获得的。这些内容我们将在以后章节中讨论。

 

1、  各声部的特点及应用

发声系统的五个声部各有特点,使用方法也不尽相同。

一般用第一声部作为主音演奏,用第二主声部作为和声伴奏,或两个声部交换位置。也就是说第一、第二主部具有近似相同的特性。

第三主声部主要用于和声伴奏,即使对其置入同第一、第二主声部相同的数据,第三主声部的发声音调也要比它们低一个八度音,同时音符的时值也缩短很多。这样安排的目的是节约数据区。

两个副声部主要用于模仿各种噪声,如鼓声、锣声、钟声、脚步声、蝉鸣声等效果音。火车运行声的模拟就是使用第一副声部实现的。

另外,各声部之间还有着密切的内在联系,只要合理搭配,就能够发出千奇百怪的奇妙音响。有兴趣的读者不妨耐心一试。

    以上讨论,我们大体上解释了引言中关于音响的问题。至于具体的音乐演奏程序的编写和背景音乐的插入方法,将在第五章详细介绍。

 

 

 

 

(第549页)

随机数产生子程序

LDA $51

AND #$02

SAT $00

LDA $52

AND #$02

EOR $00

CLC

BEQ $EDF8

SEC

EDF8: ROR $51

ROR $52

ROR $53

ROR $54

ROR $55

ROR $56

ROR $57

ROR $58

RTS

 

第451页除法

 

5.6.1系统效果音响的调用

(第295页   PDF第299页)

   通过第三章的讨论,我们已经了解到人机对话工作系统中有着丰富的效果音响,若能在我们编写的程序中直接调用,必能使编程质量提高一个档次。从表3-32可见,对话系统中由零页单元$FC控制发出的效果音有四种、由$FE控制发出的效果音有五种、由$FF控制发出的效果音有四种,共有十三种。若对$FC置入H21、H22……,还可以发出几十种不同的背景噪声,可用以模仿风声、雨声、引擎声等等。

程序No.5-37可以实现上述系统效果音响的调用。

No.5-37系统音响调用子程序

7EF7:

LDA #$00

STA $EE

LDA #$7F

STA $EF

RTS

PHA

TXA

PHA

TYA

PHA

JSR $FD5B

LDA #$00

STA $FE

STA $FF

PLA

TAY

PLA

TAX

PLA

JMP $880F

----------------

(略)

 

5.6.3音乐旋律演奏程序的编写

以上通过调用系统发声子程序,收到了较满意的效果。但是,吃嚼过的甘蔗总觉得没有滋味,可能许多朋友想尝试自己动手编写背景音乐程序。实际上,通过以上的讨论,朋友们应该能够编出这一程序,但考虑到在其它系统中编写背景音乐的因素,更为入门较晚的朋友也能早日登堂入室,特讨论如下:

我们仅以流行歌曲《小秘密》为例,具体介绍音乐旋律演奏程序的编写过程。

一、选取演奏声部及程序格式

演奏主旋律选择第一、第二主声部都可以,本例我们选择第二进制主声部。程序格式以$FC控制演奏的程序为参考加以改造(这样选择的目的:一方面使程序便于理解;另一方面便于加深对系统发声处理方法的认识。)。

二、确定程序区和数据区

$FC控制发声的数据区有三段:分为音量数据、音长数据和音符数据。由于音量、音长数据区较小,故选择$7FE0~$7FEF为音量数据区、$7FF0~$7FFF为音长数据;由于《小秘密》的音符数据量不大,故选择$7E00为存放首址;选择$7F00为程序区首址;选择$7EF7~$7EFF为进入中断程序区(该段程序运行后可以删除)。

 

三、编写演奏控制程序

根据以上的选定,改写程序见No.5-40。

No.5-40音乐旋律演奏子程序

 

7F00:

       LDA $FC

       BNE $7F0A

       STA $FB

       STA $F3

       BEQ $7F41

7F0A:

       EOR $FB

       BEQ $7F18

       LDA $FC

       STA $FB

       LDA #$00

       STA $F4

       BEQ $7F1C

7F18:

       DEC $F6

       BNE $7F41

7F1C:

       LDY $F4

INC $F4

LDA $7E00,Y

BEQ $7F12

TAX

ROR

TXA

ROL

ROL

ROL

AND #$07

TAY

LDA $7FF0,Y

STA $F6

TXA

AND #$3E

CMP #$02

BEQ $7F41

JSR $7F8A

LDA #$00

STA $F8

7F41:

LDY $F8

STA $4004

INC $F8

RTS

-----------------

 

四、写出乐谱

《小秘密》的简谱如下:

FC音乐编写研究-摘文 - 维京人 - 深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

 

 

 

五、编写数据区

根据《小秘密》的节奏特点,若选取八个中断周期为八分音符,那么附点八分音符则为十二个中断周期,相应地四分音符为十六个中断周期,其它依次类推。故音长数据区如下:

7FF0

08

0C

10

18

20

28

30

40

节拍:

1/2

3/4

1

3/2

2

5/2

3

4

音色音量数据可根据选定的乐器类型选取。我们仍选取打击乐器音色,故编写音色音量数据区如下:

7FE0   B5 B4 B3 B2 B1 B0

 

程序No.5-40的音符数据要求如下:

由数据的D0、D7、D6三位依次排成二进制的三位数作为音符音长值的地址偏移量;由数据的D5、D4、D3、D2、D1、D0六位依次排成二进制的六位数(D0位恒为零)作为音符音调值的地址偏移量。据此编写音符数据区如下:

 FC音乐编写研究-摘文 - 维京人 - 深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

 

 

六、编写音调单元赋值子程序

系统中原有的赋值子程序$FC69~$FC97已不适用乐曲《小秘密》的赋值需要,因此需要重新编写赋值子程序。为适用各声部赋值,仍采用原格式编写。程序见No.5-41。

No.5-41音调单元赋值子程序

7F70

LDY #$7F

STY $4000

STY $4001

LDX #$00

7F7A :

TAY

LDA $801E,Y

STA $4002,X

LDA $801F,Y

ORA #$08

STA $4003,X

7F89:

RTS

LDY #$7F

STY $4005

LDX #$04

BNE $7F7A

LDX #$08

CMP #$02

BEQ $7F89

BNE $7F7A

 

 

七、编写调用程序

对于演奏子程序的调用,我们并不陌生,故直接写出程序。见No5-42。

No.5-42演奏子程序的调用程序

7F50:

PHA

TXA

PHA

TYA

PHA

LDA #$0F

STA $4015

JSR $7F00

NOP

NOP

NOP

NOP

NOP

NOP

PLA

TAY

PLA

TAX

PLA

JMP $880F

 

程序No.5-42中留出了$7F5D~$7F62六个单元,以供调用两个其它声部的演奏子程序。

现在,万事具备,只要设置好中断程序入口,就可进行背景音乐的演奏了。显而易见,中断程序入口地址$7F50。故编写中断入口地址设置子程序如下:

A950:

LDA #$50

STA $EE

LDA #$7F

STA $EF

RTS

 

八、运行程序

把以上各程序写入各自的地址后,执行”CALL &7EF7”、再执行”POKE &FC,1”,就可以欣赏自己设计的背景音乐了。在自己设计的音乐伴奏下,操作电脑将是多么惬意啊!

 

九、演奏程序的完善

一个声部演奏总显单调,若再加入和声伴奏及打击乐节奏,效果将会更好,和声伴奏可以使用第一主声部,打击乐节奏可以使用第三主声部。下面仅介绍打击乐节奏的编程方法,和声伴奏留给读者练习。

为了使节奏感更强烈,且节奏的强弱随主旋律的周期而改变,特把用于第三主声部的《小秘密》歌曲的乐谱改写如下:

 FC音乐编写研究-摘文 - 维京人 - 深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

 

节奏演奏程序见No.5-43。

No.5-43第三主声部演奏子程序

A5FA:

       LDA $FA

       BNE $7FAE

       LDA $FC

STA $FA

BNE $7FA6

RTS

7FA6:

       LDA #$00

       STA $F5

       LDA #$01

       STA $F7

       DEC $F7

       BEQ $7FB3

       RTS

7FB3:

       LDY $F5

       INC $F5

LDA $7D00,Y

BNE $7FC2

STA $FA

STA $4008

RTS

7FC2:

       JSR $7F93

       LDA #$01

       STA $4008

       LDA #$08

       STA $F7

       RTS

根据No.5-43对发声数据的要求,编写节奏演奏数据如下:

FC音乐编写研究-摘文 - 维京人 - 深夜是徘徊在潮湿睫毛上的我的梦以及他的梦

 

 

把程序No.5-43和数据写入内存后,要在主控程序No.5-42中加一条调用子程序语句”JSR $7F9B”,其地址为:

现在运行程序将会聆听到富有节奏感的背景音乐了。

读者可以调整两个声部的音色数据,以演奏自己喜爱的乐器效果。

 

以上选自《电脑游戏机硬件与编程特技》

 

 

  评论这张
 
阅读(1206)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017