8bit音乐的一些相关知识

xilinx暑期学校的时候有个8bit声卡的题目很感兴趣。当时没有做,现在来研究研究。
首先先来看看8bit音乐是什么吧


8bit的产生和历史

bit顾名思义就是位的意思。我们都学过一个n位二进制数可以有 2 n 2^n 2n中可能的表示。
8bit是指声音的每一个采样由8bit组成,也就是每个采样值有256种可能。

小时候老爸带我玩过一些游戏,比如我最喜欢的魂斗罗、赤色要塞(KONAMI牛逼!!!)

魂斗罗

赤色要塞

一个经典电子音下载站

这些听起来十分带感的游戏正是8bit音乐。
传统意义上讲,8-bit音乐是一种芯片音乐。
由于
早期的游戏机发声单元有限,难以存储产生丰富和旋的乐音,芯片通常用方波、三角波、白噪声等基本波形组合出了层次丰富的音乐作品。
于是带着镣铐跳舞的艺术家们创造了一种Lo-Fi(Hi-Fi震怒)的新的音乐风格。
工程师和艺术家们将基本的声音合成引擎植入到硬件当中,使其在运行游戏时实时合成,故得名芯片音乐。

七十年代时,电脑等电子设备往往没有 声卡,只有蜂鸣器通过改变频率来表示一定的频率。
在1983年,FC在日本发行,(1985年NES在美国发行),设备有了五个声道,声音也渐渐变的丰富了起来。1

如今而言,虽说硬件设备有了长足的进步,但是8bit音乐仍然没有消亡,毕竟艺术是不朽的嘛。
仍然有许多的独立游戏等尝试制作8bit音乐、fake8bit音乐之类的作为自己的作品。


8bit音乐原理

音效芯片

任天堂的音效芯片是由RICOH公司制造的2A03E芯片2
在这里插入图片描述
共有5个声道,分别是2声道方波,1声道三角波,1声道噪音,1声道采样。3(后面一些波形图等也来自于这个视频)

方波

方波占两个声道,因为有不同的比例的波形,可以产生不同音调的声音,可以类比为电声乐队的两把吉他。
在这里插入图片描述
在2A03E中共有四种波形可以选择
在这里插入图片描述
除此之外还有75%的波,其听上去和25%几乎相同,从波形上讲相当于是加了反相。

三角波

三角波,顾名思义,就是波峰波谷全为三角形,可以类比为电声乐队的贝司
在这里插入图片描述
通常被用作低声部使用。

噪声

噪音占一声道,在FC游戏的音乐和音效中是最常见的,爆炸声、脚步声、碰撞声以及音乐的节奏点等等都是用噪音制作的。

比起制造音效,更重要的作用的打节奏。因为噪音比起方波三角波更有辨识度,能够营造比较好的节奏感,可以类比为电声乐队的鼓。

采样

最后还有一个声道是采样声道
顾名思义就是可以播放录制好的声音。不过早期受限于硬件,这个功能很少被使用。


音名频率表
在这里插入图片描述

在上述基本波形中,矩形脉冲波可以调节占空比来调节音色,其音色明亮,适用于旋律线;三角波的高频分量更低,适合用于低声部;锯齿波介于二者之间。短时白噪声常用于节奏。

用python来进行一些声音生成4

要生成方波或者三角波,我们可以定义函数,其将t时刻对应的离散波形值输出。

def triangleWave(fre,amp = 0.4):
    '''对连续三角波函数离散取样'''
    wave_length = sample_rate//fre ## 波长 = 采样率/频率

    def sampler(t):
        saw_wave = t / wave_length - floor(t / wave_length + 0.5) ## 锯齿波
        tri_wave = 2 * abs(2*saw_wave) - 1 ## 通过绝对值反折
        return amp * tri_wave
    return sampler

同理可有方波

def SquareWave(fre,amp=0.4,dutyCycle = 0.25):
    '''对方波进行离散取样'''
    wave_length = sample_rate//fre ## 波长 = 采样率/频率
    high = wave_length*dutyCycle
    def sampler(t):
        cur = t%wave_length
        if cur<high:
            return amp
        else:
            return 0
    return sampler

接下来可以将其编码,并将某段时长的内容写入到本地文件中,然后听听效果。

def encode(x):
    '''将-1到1的浮点数编码进两个字节(放大到-16384~16384,范围为32768),https://docs.python.org/3/library/struct.html'''
    i = int(16384 * x)
    return Struct('h').pack(i)

def writeWave(sampler,name='wave.wav',seconds = 2):
    out = open(name,'wb')
    out.setnchannels(1)
    out.setsampwidth(2)
    out.setframerate(sample_rate)
    t = 0
    while t < seconds *sample_rate:
        sample = sampler(t)
        out.writeframes(encode(sample))
        t += 1
    out.close()

参考资料


  1. 知乎 上和弦 如何制作8-bit音乐? ↩︎

  2. Nice Chord 好和弦附带练习乐谱下载 流行歌編曲教學 第101p ↩︎

  3. 无门槛利用web技术创作8bit音乐(实践篇)
    ↩︎

  4. Python 输出声音 ↩︎

  • 11
    点赞
  • 43
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

豆沙粽子好吃嘛!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值