File size: 2,354 Bytes
e882f51
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
import os
head_list = ["C", "C#", "D", "D#", "E", "F", "F#", "G", "G#", "A", "A#", "B"]


def trans_f0_seq(feature_pit, transform):
    feature_pit = feature_pit * 2 ** (transform / 12)
    return round(feature_pit, 1)


def move_key(raw_data, mv_key):
    head = raw_data[:-1]
    body = int(raw_data[-1])
    new_head_index = head_list.index(head) + mv_key
    while new_head_index < 0:
        body -= 1
        new_head_index += 12
    while new_head_index > 11:
        body += 1
        new_head_index -= 12
    result_data = head_list[new_head_index] + str(body)
    return result_data


def trans_key(raw_data, key):
    for i in raw_data:
        note_seq_list = i["note_seq"].split(" ")
        new_note_seq_list = []
        for note_seq in note_seq_list:
            if note_seq != "rest":
                new_note_seq = move_key(note_seq, key)
                new_note_seq_list.append(new_note_seq)
            else:
                new_note_seq_list.append(note_seq)
        i["note_seq"] = " ".join(new_note_seq_list)

        f0_seq_list = i["f0_seq"].split(" ")
        f0_seq_list = [float(x) for x in f0_seq_list]
        new_f0_seq_list = []
        for f0_seq in f0_seq_list:
            new_f0_seq = trans_f0_seq(f0_seq, key)
            new_f0_seq_list.append(str(new_f0_seq))
        i["f0_seq"] = " ".join(new_f0_seq_list)
    return raw_data


def trans_opencpop(raw_txt, res_txt, key):
    if os.path.exists(raw_txt):
        f_w = open(res_txt, "w", encoding='utf-8')
        with open(raw_txt, "r", encoding='utf-8') as f:
            raw_data = f.readlines()
            for raw in raw_data:
                raw_list = raw.split("|")
                new_note_seq_list = []
                for note_seq in raw_list[3].split(" "):
                    if note_seq != "rest":
                        note_seq = note_seq.split("/")[0] if "/" in note_seq else note_seq
                        new_note_seq = move_key(note_seq, key)
                        new_note_seq_list.append(new_note_seq)
                    else:
                        new_note_seq_list.append(note_seq)
                raw_list[3] = " ".join(new_note_seq_list)
                f_w.write("|".join(raw_list))
        f_w.close()
        print("opencpop标注文件转换完毕")
    else:
        print("未发现opencpop标注文件,请检查路径")