用python按照告白气球的简谱写一个告白气球伴奏,这是用正弦函数模拟的波形,声音有点难听,待更新换个钢琴波形。

# -*- coding:utf-8 -*-

import wave, struct
from math import *
from time import sleep
from tqdm import tqdm

file = wave.open('ConfessionBallon.wav', 'w')
file.setframerate(8000)
file.setnchannels(1)
file.setsampwidth(2)

a = 0.69
b = a / 2
c = b / 2

def writevoice(duration = 0, frequency = 0, volume = 0.5, writefile = file, sr = 8000):
    time = 0
    t = 1.0 / sr
    while (time < duration):
        voice = int(sin(time * 2 * pi * frequency) * volume * pow(2, 15))
        data = struct.pack('h', voice)
        writefile.writeframes(data)
        time += t

table = {
        "0": 0,
        "1---": 62, "1#---": 63, "2b---": 64, "2---": 65, "2#---": 69, "3b---": 69, "3---": 73, "4---": 82, "4#---": 84, "5b---": 85, "5---": 87, "5#---": 92, "6b---": 92, "6---": 98, "6#---": 104, "7b---": 104, "7---": 110,
        "1--": 123, "1#--": 127, "2b--": 127, "2--": 131, "2#--": 139, "3b--": 139, "3--": 147, "4--": 165, "4#--": 170, "5b--": 170, "5--": 175, "5#--": 185, "6b--": 186, "6--": 196, "6#--": 208, "7b--": 208, "7--": 220,
        "1-": 247, "1#-": 254, "2b-": 255, "2-": 262, "2#-": 278, "3b-": 278, "3-": 294, "4-": 330, "4#-": 339, "5b-": 340, "5-": 349, "5#-": 370, "6b-": 371, "6-": 392, "6#-": 416, "7b-": 416, "7-": 440,
        "1": 494, "1#": 508, "2b": 509, "2": 523, "2#": 555, "3b": 555, "3": 587, "4": 659, "4#": 678, "5b": 679, "5": 698, "5#": 741, "6b": 741, "6": 784, "6#": 832, "7b": 832, "7": 880,
        "1+": 988, "1#+": 1017, "2b+": 1018, "2+": 1047, "2#+": 1111, "3b+": 1111, "3+": 1175, "4+": 1319, "4#+": 1358, "5b+": 1358, "5+": 1397, "5#+": 1482, "6b+": 1483, "6+": 1568, "6#+": 1664, "7b+": 1664, "7+": 1760,
        "1++": 1976, "1#++": 2034, "2b++": 2035, "2++": 2093, "2#++": 2221, "3b++": 2221, "3++": 2349, "4++": 2637, "4#++": 2715, "5b++": 2716, "5++": 2794, "5#++": 2965, "6b++": 2965, "6++": 3136}

scale = [
    "0", "0", "5", "1+", "7", "5", "1", "1", "5", "2", "3", "3", "3", "3", "0", "5", "1+", "7", "5", "1", "1", "5", "2", "3", "4", "3",
    "3", "0", "5", "2+", "1+", "7", "1+", "1+", "2+", "3+", "1+", "1+", "6", "6", "7", "1+", "5", "5", "1", "5", "4", "3", "2", "1", "1",
    "1", "7-", "7",
    "0", "1+", "1+", "7", "1+", "0", "7", "1+", "7", "1+", "0", "2+", "3+", "0", "7", "7", "6", "7", "0", "6", "7", "6", "7", "0", "1+",
    "0", "6", "1+", "3+", "2+", "1+", "3+", "3+", "0", "3+", "3+", "2+", "1+", "0", "1+", "1+", "7", "1+", "0", "7", "1+", "7", "1+", "0", "2+", "3+",
    "0", "7", "7", "6", "7", "0", "6", "7", "6", "7", "0", "1+", "0", "6", "1+", "3+", "2+", "1+", "1+", "1+", "6", "7",
    "1+", "1+", "1+", "1+", "6", "6", "7", "1+", "1+", "1+", "2+", "2+", "5", "6", "7", "7", "7", "7", "5", "5", "6",
    "7", "7", "7", "1+", "1+", "1+", "1+", "2+", "3+", "3+", "3+", "6", "1+", "1+", "2+", "3+", "3+", "6+", "3+", "1+", "1+", "1+", "2+",
    "3+", "3+", "3+", "3+", "1+", "3+", "2+", "2+", "0", "5", "4+", "3+", "3+", "4+", "3+", "2+", "2+", "1+", "2+", "3+", "1+", "1+",
    "6", "1+", "5+", "1+", "3+", "3+", "3+", "0", "5", "4+", "3+", "3+", "4+", "3+", "2+", "2+", "1+", "2+", "3+", "6+", "6+",
    "5+", "7", "1+", "2+", "2+", "1+", "1+",
    "1+", "2+", "3+", "5+", "2+", "1+", "5+", "7", "7", "7", "6", "7", "1+", "2+",
    "3+", "0", "5", "1+", "2+", "3+", "5+", "2+", "1+", "5+", "7", "7", "7", "6", "7", "1+", "2+", "1+",
    "0", "1+", "1+", "7", "1+", "0", "7", "1+", "7", "1+", "0", "2+", "3+", "0", "7", "7", "6", "7", "0", "6", "7", "6", "7", "0", "1+",
    "0", "6", "1+", "3+", "2+", "1+", "3+", "3+", "0", "3+", "3+", "2+", "1+", "0", "1+", "1+", "7", "1+", "0", "7", "1+", "7", "1+", "5+", "6+", "5+",
    "0", "7", "7", "6", "7", "0", "6", "7", "6", "7", "3+", "4+", "3+", "0", "6", "1+", "3+", "2+", "1+", "1+", "1+", "6", "7",
    "1+", "1+", "1+", "1+", "6" ,"6", "7", "1+", "1+", "1+","2+", "2+", "5", "6", "7", "7", "7", "7", "5", "5", "6",
    "7", "7", "7", "1+", "1+", "1+", "1+", "2+", "3+", "3+", "3+", "6", "1+", "1+", "2+", "3+", "3+", "6+", "3+", "2+", "1+", "1+", "2+",
    "3+", "3+", "3+", "6", "1+", "3+", "2+", "2+", "3+", "0", "5", "4+", "3+", "3+", "4+", "3+", "2+", "2+", "1+", "2+", "3+", "1+", "1+",
    "6", "1+", "5+", "1+", "3+", "3+", "3+", "0" ,"5", "4+", "3+", "3+", "4+", "3+", "2+", "2+", "1+", "2+", "3+", "6+", "6+",
    "5+", "7", "1+", "2+", "2+", "1+", "1+", "0", "5", "4+", "3+", "3+", "4+", "3+", "2+", "2+", "1+", "2+", "3+", "1+", "1+",
    "6", "1+", "5+", "1+", "3+", "3+", "3+", "0", "5", "4+", "3+", "3+", "4+", "3+", "2+", "2+", "1+", "2+", "3+", "6+", "6+",
    "5+", "7", "1+", "2+", "2+", "1+", "1+", "0", "5", "4+", "3+", "3+", "4+", "3+", "2+", "2+", "1+", "2+", "3+", "6+", "6+", "6+",
    "5+", "7", "1+", "2+", "2+", "1+", "1+", "0"
]

length = [
    a, b, b, b, b, b, b, a, b, a, b, b, b, a, b, b, b, b, b, b, a, b, a, b, b, b,
    a, b, b, b, b, b, b, a, b, a, b, b, b, a, b, a, b, b, b, b, a, b, a, b, a,
    a + b, b, 2 * a,
    c, c, c, c, b, c, c, c, c, b, b, c, c, c, c, c, c, b, c, c, c, c, b, b, b,
    a, b, b, b, b, b, b, 2 * a, b, b, b, c, c, c, c, c, c, b, c, c, c, c, b, b, c, c,
    c, c, c, c, b, c, c, c, c, b, b, b, a, b, b, b, b, b, b, 3 * a, b, b,
    b, b, b, b, a, b, b, b, b, b, b, a, b, b, b, b, b, b, a, b, b,
    b, b, b, b, b + c, c, b, b, b, b, b, b, a, b, b, b, b, b, c, c, a, b, b,
    b, b, b, a, b, b, b, 2 * a, b, b, b, b, a, b, a, b, a, a, b, a, b, a,
    a, b, a, b, b, b, 2 * a, b, b, b, b, a, b, a, b, a, a, b, a, b, a,
    a, b, a, b, b, b, a * 3,
    b, b, a, a, 2 * a, a, a, a + b, c, c, a, a, a + b, b,
    2 * a, b, b, b, b, a, a, 2 * a, a, a, a + b, c, c, a, a, a + b, b, 4 * a,
    c, c, c, c, b, c, c, c, c, b, b, c, c, c, c, c, c, b, c, c, c, c, b, b, b,
    a, b, b, b, b, b, b, 2 * a, b, b, b, c, c, c, c, c, c, b, c, c, c, c, b, b, c, c,
    c, c, c, c, b, c, c, c, c, b, b, c, c, a, b, b, b, b, b, b, 3 * a, b, b,
    b, b, b, b, a, b, b, b, b, b, b, a, b, b, b, b, b, b, a, b, b,
    b, b, b, b, b + c, c, b, b, b, b, b, b, a, b, b, b, b, b, c, c, a, b, b,
    b, b, b, a, b, b, b, a, a, b, b, b, b, a, b, a, b, a, a, b, a, b, a,
    a, b, a, b, b, b, 2 * a, b, b, b, b, a, b, a, b, a, a, b, a, b, a,
    a, b, a, b, b, b, 2 * a, b, b, b, b, a, b, a, b, a, a, b, a, b, a,
    a, b, a, b, b, b, 2 * a, b, b, b, b, a, b, a, b, a, a, b, a, b, a,
    a, b, a, b, b, b, 2 * a, b, b, b, b, a, b, a, b, a, a, b, a, b, a, 4 * a,
    a, b, a, b, b, b, 3 * a, a
]

def main():
    for i in tqdm(range(len(scale)), desc='The "Confession Ballon" accompaniment is being produced'):
        writevoice(length[i] / 1.0, table[scale[i]])

if __name__ == '__main__':
    main()


file.close()

运行结果: