【python】【転送】pythonプログラムで簡易スペクトル転送を実現

18759 ワード

一、任務
pythonで指定したメロディーをあるトーンからあるトーンに変換する機能を実現します.
二、原理
X調をY調に回し、Xリットル(X-Y)個の半音注:ここでX-Yは半音関係を表し、以下のtrans_に対応するmap辞書注意:入力された音階は、8度より大きい音域を表すことができます.ここで採用する戦略は、音符の前にある場合である.(点)は最初の8度を表す、音符の後ろにあれば.8度高いことを表します.
三、コード
#trans_map:          ,         1
trans_map = {'C':0,'bD':1,'D':2,'bE':3,'E':4,'F':5,'bG':6,'G':7,'bA':8,'A':9,'bB':10,'B':11}
#C_scale:C     
C_scale = ['1','#1','2','#2','3','4','#4','5','#5','6','#6','7']

#    :     ,   ,    
def trans_tonality(Tune,Tune_Tonality,Aim_Tonality):
    tune = []                                                   #      
    minus = trans_map[Tune_Tonality]-trans_map[Aim_Tonality]        #    
    at = C_scale[minus:]+C_scale[:minus]      #                
    for t in list(Tune.split(',')):                         #        
        position = [i.start() for i in re.finditer('\.', t)] #    .   

        if position == []:                #       .
            low_num = 0
            high_num = 0
        elif position[0]==0:              #      .
            low_num = len(position)
            high_num = 0
        else:                             #      .
            high_num = len(position)
            low_num = 0
        if minus>0:
            high_num += 1
            low_num -= 1
        t = t.translate(str.maketrans('','','.')) #.         ,     

        if len(t)==1:                     #     
            ori = int(t)
            if int(t)<4:                  #do re mi
                new_tune = at[int(t)*2-2]
            elif int(t)<8:                #fa sol la ti
                new_tune = at[int(t)*2-3]
            else:
                new_tune = 'Error'
        elif len(t)==2:                   #    
            ori = int(t[1])               #     
            if 'b' in t:                  #     b,    #,       ; b6  #5
                t = '#'+str(int(t[1])-1)
            if int(t[1])<3:               # #do #re
                print(t[1])
                new_tune = str(at[int(t[1])*2-1])
            elif int(t[1])<7:             # #fa #sol #la
                new_tune = str(at[int(t[1])*2-2])
            else:
                new_tune = 'Error'
        else:
            new_tune = 'Error'

        try:                              #       .         ,   .
            if int(new_tune[-1]) > ori:
                if high_num > 0:
                    high_num -= 1
                else:
                    low_num += 1
            for i in range(low_num):
                new_tune = '.' + new_tune
            for i in range(high_num):
                new_tune = new_tune + '.'
            tune.append(new_tune)
        except:
            tune.append('Error')

    print(tune)

#    :trans_tonality(Tune,Tune_Tonality,Aim_Tonality)  ,   ,    
trans_tonality('1,1,5,5,6,6,5,4,4,3,3,2,2,1','C','D')
trans_tonality('1,1,5,5,6,6,5,4,4,3,3,2,2,1','D','C')
#   :
#['.#6', '.#6', '4', '4', '5', '5', '4', '#2', '#2', '2', '2', '1', '1', '.#6']
#['2', '2', '6', '6', '7', '7', '6', '5', '5', '#4', '#4', '3', '3', '2']