数字简谱转调工具V1

问题来源,原本C调,根据翻唱歌曲音高,需要升或者降调,但是使用C把位,所以只有C调看起来是方便的。

所以将变调后的数字谱,统一改写C调,为方便使用数字谱的初学者们(包括自己),因此写下这个程序

如图,这是原C调谱这个是经过程序改写的降调小三度的C大调数字谱也是升A调

(非专业)初学者理解公示表(单位:一个半音)

附代码(python)

import re
# MAJOR=2
MAJOR=int(input("一个小二度为一个单位音程\n例如C转B输入-1\n请输入升降音程\n"))
f = open("input.txt",'r') #这是一般的使用形式
with open ("output.txt",'a')as f_input:
    f_input.write('=================================MAJOR=%s=================================\n'%MAJOR)
arr=['1','#1','2','#2','3','4','#4','5','#5','6','#6','7']
    # 0    1    2   3    4    5    6   7    8    9   10   11
for ss in f.readlines():
    ss = re.sub(r"1=", "N=", ss)
    for i in range(1,8):
        ss = re.sub(r'%d'%(i),'z%d'%(i),ss)
    for i in range(1,8):
         if i < 4:
              ss = re.sub(r"#z%d"%i, arr[(12*5+(i-1)*2+1  +MAJOR)%12], ss)
              ss = re.sub(r"z%d"%i,  arr[(12*5+(i-1)*2   +MAJOR)%12], ss)
         if 3 < i < 7:
             ss = re.sub(r"#z%d"%i, arr[(12*5+(i-1)*2  +MAJOR)%12], ss)
             ss = re.sub(r"z%d"%i, arr[(12*5+(i-1)*2-1 +MAJOR)%12], ss)
         if i==7:
             ss = re.sub(r"#z%d"%i, arr[(12*5+0        +MAJOR)%12], ss)
             ss = re.sub(r"z%d"%i, arr[(12*5+(i-1)*2-1 +MAJOR)%12], ss)

    ss = re.sub(r"N=","1=", ss)
    tt=ss
    with open("output.txt", 'a')as f_input:
        f_input.write(tt)
    print(ss)

 数据结构:循环队列

或者说是小学奥数余数规律

内容:

在input.txt文件写目标谱,利用音程变化规律满足一个数字列,通过移动数列实现转谱很简单

运行程序输入升降音程(单位:一个半音)

输出结果

这样就转好了

注意我没有做过滤处理,请确保您的输入完全是GBK字符

该程序没有涉及小调转谱,因为暂时没有用上

另外数字谱表示高音低音都不一样,我这里[ ]表示括号内高音,( )括号内低音,{ }合奏,所以该程序没有识别括号的功能,通过升高或者降低音调,比如7--> i,应该改为7->[1],但是没有改则输出这个7->1,需要手动改,同理降调"借位"一样。

在MATLAB中,要对音乐转调位置进行判断,可以使用音频信号处理的技术。一种常见的方法是使用自相关函数来检测音乐中的关键音符,并根据关键音符的变化来确定转调位置。下面是一个示例代码: ```matlab % 加载音频文件 [y, Fs] = audioread('music.wav'); % 提取音频信号的自相关函数 autocorr_y = xcorr(y); % 计算自相关函数的峰值位置 [~, locs] = findpeaks(autocorr_y, 'MinPeakHeight', 0.5*max(autocorr_y)); % 根据峰值高度阈值找到自相关函数的峰值位置 % 计算峰值位置之间的差值,即关键音符之间的间隔 intervals = diff(locs); % 判断转调位置 trans_positions = find(intervals > threshold); % 根据间隔大小判断转调位置,threshold为判断阈值 % 打印转调位置 if ~isempty(trans_positions) fprintf('音乐转调位置在以下帧之后:'); disp(trans_positions); else fprintf('音乐没有明显的转调位置。\n'); end ``` 上述代码中,我们首先提取了音频信号的自相关函数,然后通过寻找自相关函数的峰值位置来确定关键音符的位置。接着,我们计算了关键音符之间的间隔,并根据间隔大小来判断转调位置。如果存在间隔大于阈值的位置,则认为这些位置是转调位置。 请注意,阈值的选择可能需要根据具体的音乐样本进行调整。此外,这只是一种基本的方法,对于复杂的音乐转调判断,可能需要更复杂的算法和处理步骤。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值