**python 随机生成一段旋律**

python 随机生成一段旋律

一直想能不能让计算机也能像音乐家一样作曲?但是自己知识有限,不能写出这样宏大的工程,所以就想能不能随机生成一段旋律呢?生成后的效果如何呢?于是就开始coding.
直接上代码:
#coding:utf-8
'''
作者:一江叶影
日期:2020.7.17
标题:随机生成一段旋律
'''
import numpy as np#调用np产生随机数
import wave#保存输出得旋律得函数库

framerate=44100#设置音频采样率

def can_shu_she_ding():#参数设定函数
    shu_du=input("请输入旋律的速度(bpm):")
    jie_pai=input("请输入每小节有多少拍:")
    xiao_jie=input("请输入希望生成几个小节的旋律:")
    return int(shu_du),int(jie_pai),int(xiao_jie)

def pin_nv(f,framerate):#得到do ,re ,mi ...等音阶对应的声音频率
    num=int(framerate/f)#求相应频率一个周期对应的采样数
    frame=[]#初始化一个空列表
    for i in range(num):#记录半个周期的电平信号
        a=b'255'
        frame.append(a)
    for i in range(num):#记录半个周期的无电平信号
        a=b'0'
        frame.append(a)
    print("frame=",frame)
    return frame#返回一个周期的频率对应的bytes

def get_yin_jie(num,framerate):#随机得到音阶得函数
    if num==1:
        frame=pin_nv(261.6,framerate)
        return frame
    if num==2:
        frame=pin_nv(293.6,framerate)
        return frame
    if num==3:
        frame=pin_nv(329.6,framerate)
        return frame
    if num==4:
        frame=pin_nv(349.2,framerate)
        return frame
    if num==5:
        frame=pin_nv(392.0,framerate)
        return frame
    if num==6:
        frame=pin_nv(440.0,framerate)
        return frame
    if num==7:
        frame=pin_nv(493.0,framerate)
        return frame




path="D:/360MoveData/Users/Administrator/Desktop/AI音乐/test.wav"#我将生成的旋律放在D盘,可灵活改写
song=wave.open(path,'wb')#打开文件

song.setnchannels(1)#设置声道数,单身到道
song.setsampwidth(2)#设置码率,2个字节
song.setframerate(framerate)#设置采样频率44.1KHZ
comtype="NONE"#默认
compname="not compressed"#默认

shu_du,jie_pai,xiao_jie=can_shu_she_ding()#调用初始化函数设置参数

for j in range(xiao_jie*jie_pai):#对每一个节拍循环操作,共xiao_jie*jie_pai个节拍
    print("第%d小节;"%(j/jie_pai))#为了跟踪程序运行得打印函数,可以不加
    frame=get_yin_jie(np.random.randint(1,8),framerate)#取一个音阶得单周期频率
    rand=int(60/shu_du*framerate/len(frame))#计算每拍有多少个音阶频率
    for k in range(rand):
        for i in frame:
            song.writeframes(i)#写入文件夹
print("旋律输出成功")
song.close()#关闭文件夹

算法的核心思想是:

.WAV格式的文件的数据是比特流,其中有几个重要的参数:采样率,声道,码率,音频播放器播放音频时是逐桢播放的;一般的wav音频文件是双声道的,这样听起来比较真实,而单声道就比较好进行处理,它的每一帧是2Byte,这样我们就可以一帧一帧的生成,最后合起来就是一个音频文件了;
但是随即生成的音频听起来就是噪声,类似以前显像管电视机发出的雪花的声音,于是要对写入的每一帧进行调整;我们知道乐音是有规律的振动,七个音阶是有固定频率范围的,所以只需要生成音阶对应频率的帧序列,并将这些桢序列持续时间、强度、组合方式进行随机调整,就可以随机产生一组旋律了。
这样产生的旋律效果不是很好,节奏感、强弱变化较弱,而且随机的,也没有风格可言,所以还是可以继续改进。初步想法是用神经网络训练一下,可能可以生成比较好听的旋律,这一方面我还要继续学习;

链接:https://editor.csdn.net/md/?not_checkout=1.

图片: 在这里插入图片描述

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
随机生成一个9x9的九宫格,你可以使用Python的random模块来生成随机数,并确保生成的数字满足九宫格的规则。下面是一个示例代码: ```python import random def generate_sudoku(): board = [[0] * 9 for _ in range(9)] solve_sudoku(board) remove_cells(board, 40) # 移除40个数字,生成随机的九宫格 return board def solve_sudoku(board): if not find_empty(board): return True else: row, col = find_empty(board) numbers = list(range(1, 10)) random.shuffle(numbers) for num in numbers: if is_valid(board, num, (row, col)): board[row][col] = num if solve_sudoku(board): return True board[row][col] = 0 return False def find_empty(board): for i in range(9): for j in range(9): if board[i][j] == 0: return i, j return None def is_valid(board, num, pos): # 检查行 for i in range(9): if board[pos[0]][i] == num and pos[1] != i: return False # 检查列 for i in range(9): if board[i][pos[1]] == num and pos[0] != i: return False # 检查方块 box_x = pos[1] // 3 box_y = pos[0] // 3 for i in range(box_y * 3, box_y * 3 + 3): for j in range(box_x * 3, box_x * 3 + 3): if board[i][j] == num and (i, j) != pos: return False return True def remove_cells(board, num_cells): cells = [(i, j) for i in range(9) for j in range(9)] random.shuffle(cells) for i in range(num_cells): row, col = cells[i] board[row][col] = 0 ``` 调用`generate_sudoku`函数将生成一个随机的9x9九宫格,并返回该九宫格的二维数组。这个函数首先通过调用`solve_sudoku`函数来生成一个完整的解决方案,然后通过调用`remove_cells`函数来移除指定数量的数字,以生成一个随机的九宫格。 请注意,这里的代码只是一个简单的示例,你可以根据自己的需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值