用户:
Albert钟查看:6 回复:8 评论:6 创建时间:2021-07-06T14:35:39
首先看看合成效果喵file/克罗地亚狂想曲.wav
mfo3jtr.nat.ipyingshe.com/file/雪绒花.wav
Talk is cheap, show me the code:
import media
from pydub import *
from pydub.playback import play
class GenerateMusic():
def __init__(self, beat):
self.music = AudioSegment.empty()
self.dt = 1000 / (beat / 60)
self.st = 50
self.load()
def load(self):
self.sounds = {}
self.sounds['0'] = AudioSegment.silent(duration=8000)
for i in range(1, 8):
self.sounds[f'{i}---'] = AudioSegment.from_wav(f'sound/{i}---.wav')
self.sounds[f'{i}--'] = AudioSegment.from_wav(f'sound/{i}--.wav')
self.sounds[f'{i}-'] = AudioSegment.from_wav(f'sound/{i}-.wav')
self.sounds[f'{i}'] = AudioSegment.from_wav(f'sound/{i}.wav')
self.sounds[f'{i}+'] = AudioSegment.from_wav(f'sound/{i}+.wav')
self.sounds[f'{i}++'] = AudioSegment.from_wav(f'sound/{i}++.wav')
self.sounds[f'{i}+++'] = AudioSegment.from_wav(f'sound/{i}+++.wav')
if i != 3 and i != 7:
self.sounds[f'b{i+1}---'] = self.sounds[f'#{i}---'] = AudioSegment.from_wav(f'sound/#{i}---.wav')
self.sounds[f'b{i+1}--'] = self.sounds[f'#{i}--'] = AudioSegment.from_wav(f'sound/#{i}--.wav')
self.sounds[f'b{i+1}-'] = self.sounds[f'#{i}-'] = AudioSegment.from_wav(f'sound/#{i}-.wav')
self.sounds[f'b{i+1}'] = self.sounds[f'#{i}'] = AudioSegment.from_wav(f'sound/#{i}.wav')
self.sounds[f'b{i+1}+'] = self.sounds[f'#{i}+'] = AudioSegment.from_wav(f'sound/#{i}+.wav')
self.sounds[f'b{i+1}++'] = self.sounds[f'#{i}++'] = AudioSegment.from_wav(f'sound/#{i}++.wav')
self.sounds[f'b{i+1}+++'] = self.sounds[f'#{i}+++'] = AudioSegment.from_wav(f'sound/#{i}+++.wav')
def addTheme(self, symbols, dbfs):
self.theme = self.parse(symbols)
self.theme = self.theme.apply_gain(dbfs)
self.music += self.theme
def addChord(self, symbols, dbfs):
self.chord = self.parse(symbols)
self.chord = self.chord.apply_gain(dbfs)
self.music = self.music.overlay(self.chord)
def parse(self, symbols):
self.symbol = ''
self.time = self.dt
music = AudioSegment.empty()
for i in range(len(symbols)):
if i == len(symbols) - 1:
result = self.next(symbols[i])
else:
result = self.next(symbols[i], symbols[i+1])
if result:
self.sound = self.sounds[self.symbol][self.st: self.st+self.time]
music += self.sound
self.symbol = ''
self.time = self.dt
return music
def next(self, content, ncontent=None):
self.start = ['0', '1', '2', '3', '4', '5', '6', '7']
self.mod = ['#', 'b']
if ncontent:
if content in self.start:
self.symbol += content
elif content == '+' or content == '-':
self.symbol += content
elif content == '~':
self.time += self.dt
elif content == '/':
self.time /= 2
elif content == '.':
self.time *= 3/2
if content in self.mod:
self.symbol += content
elif ncontent in self.start or ncontent in self.mod:
return True
else:
if content in self.start:
self.symbol += content
elif content == '+' or content == '-':
self.symbol += content
elif content == '~':
self.time += self.dt
elif content == '/':
self.time /= 2
elif content == '.':
self.time *= 3/2
return True
def play(self):
play(self.music)
def export(self, path):
self.music.export(path, 'wav')
music = GenerateMusic(100)
music.addTheme('''3~~~7+//1++//6+/7+//1++//6+~/3+//4+//2+/3+//4+//2+/~
#4+//#5+//3+/3+/7//1+//6/7//1+//6~ 7+//1++//6+/ 7+//1++//3++//6+//
3+//4+//2+/ 3+//4+//6+//2+// #4+//#5+//3+/ 3+/7//1+// 6/7//1+//6
7//1+//6 3+//6//7//1+//6 3+//6//7//1+//6/ 6/#5//6/ 6//7//1+//6
7//1+//6 3+//6//7//1+//6 3+//6//7//1+//6/ 6/#5//6/ 6//7//1+//6
7//1+//6 3//6-//7-//1//6- 3//6-//7-//1//6-/ 6-/#5-//6-/.7-//1//6-
7//1+//6 3//6-//7-//1//6- 3//6-//7-//1//6-/ 6-/#5-//6-/.7-//1//6-
1+//3//6//7// 1+//3//6//1+// 2+//3//1+//3// 7//3//6//3//
7//3//#5//6// 7//3//5//7// 1+//3//7//3// 6//3//3+//3//
1+//3//6//7// 1+//3//6//1+// 2+//3//1+//3// 7//3//6//3//
3+//3//#5//3// 1+//3//7//3// 6//3//3+//3//6
1++//3+//6+//7+// 1++//3+//6+//1++// 2++//3+//1++//3+// 7+//3+//6+//3+//
7+//3+//#5+//6+// 7+//3+//5+//7+// 1++//3+//7+//3+// 6+//3+//3++//3+//
1++//3+//6+//7+// 1++//3+//6+//1++// 2++//3+//1++//3+// 7+//3+//6+//3+//
3++//3+//#5+//3+// 1++//3+//7+//3+// 6+//3+//3++//3+//6+
3+//6//1+//2+// 3+//6//1+//5+// 4+//6//3+//6// 2+//6//1+//6//
2+//5//7//1+// 2+//5//7//4+// 3+//5//2+//5// 1+//5//7//5//
1+//4//6//7// 1+//4//6//3+// 2+//4//1+//4/ 7//4//6//4//
7//3//#5//7// 2+/5//7//2+// 3+//7//2+//3+// #5+//2+//3+//5+//
7+//3+//#5+//7+// 2++//5+//7+//2++// 3++//7+//2++//3++//
#5++//2++//3++//5++// 6++~~~~~~~''', 0)
music.addChord('''6--~~~6-~~4-~~3-~6--~~ 6-~4-~3-~6--~6---~4--~3--~6---~6---~4--~
3--~6---~6--1-2--4--3--#5--6---3--
6--/.6--//6-//3-//6--/ 2--/.2--//2-//6--//2--/ 3--#5--6---3--
6--/.6--//6-//3-//6--/ 2--/.2--//2-//6--//2--/ 3--#5--6---3--
6--6-2--2- 3--3-6---3-- 6--6-2--2- 3--~6-.0/
6--1-2--4-- 3--#5--6---3-- 6--1-2--4-- 3---~3-.0/
6--//1-//3-//6-// 1//6-//3-//1-// 2--//4--//6--//2-// 4-//2-//6--//4--//
5--//7--//2-//5-// 7-//5-//2-//7--// 1--//3--//5--//1-// 3-//1-//5--//3--//
4--//6--//1-//4-// 6-//4-//1-//6--// 2--//4--//6--//2-// 4-//2-//6--//4--//
6---//1--/3--// 2--//6---//1--//7---//
6---//1--/3--// 2--//6---//1--//7---//''', -1)
music.play()
music.export('new.wav')
逻辑十分明了嘛,读取简谱,将单音拼接,再将多音轨增益后重叠。(要钢琴88音素材的下方把邮箱留给我)