File size: 5,506 Bytes
3888ab7
 
 
 
 
 
2278710
3888ab7
 
 
a2c6cfa
 
29090fa
6df655f
 
 
 
 
06d58f4
 
6df655f
 
3888ab7
 
6df655f
 
64e309b
6df655f
 
64e309b
6df655f
 
 
64e309b
cf7d19c
6df655f
64e309b
6df655f
cf7d19c
d26b0ba
64e309b
d26b0ba
64e309b
d26b0ba
64e309b
d26b0ba
64e309b
 
6df655f
64e309b
6df655f
d26b0ba
 
 
 
6df655f
 
 
d26b0ba
cf7d19c
6df655f
d26b0ba
 
 
 
 
6df655f
03cc79b
6df655f
d26b0ba
6df655f
 
 
 
 
 
 
 
 
d26b0ba
6df655f
 
 
 
 
 
5c6968d
6df655f
 
e476fc7
5c6968d
 
91d5e8a
d26b0ba
 
 
 
 
 
e476fc7
d26b0ba
 
6df655f
 
 
3888ab7
 
 
 
 
eec4853
3888ab7
eec4853
1aa6fb6
003cd1a
3888ab7
e469266
 
29090fa
e469266
 
3888ab7
 
03cc79b
 
e30e402
03cc79b
 
 
3888ab7
03cc79b
8c43bea
3888ab7
86dfaf8
003cd1a
03cc79b
86dfaf8
3adc64e
fbae75f
c12a6f7
4016ab4
fbae75f
 
 
c04453c
64e309b
c12a6f7
d85cb0d
7dd6e93
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
import argparse
import glob
import os.path

import gradio as gr

import pickle
import tqdm
import json

import TMIDIX
from midi_to_colab_audio import midi_to_colab_audio

import copy
from collections import Counter
import random
import statistics

import matplotlib.pyplot as plt

#==========================================================================================================

in_space = os.getenv("SYSTEM") == "spaces"

#==========================================================================================================

def find_midi(search_string, search_options):
  
    print('=' * 70)
    print('Preparing to search...')
    
    #==================================================
    
    
    random.shuffle(AUX_DATA)
    
    search_data = []
    
    for A in AUX_DATA:
        data = ''
        if 'Titles' in search_options:
            data += A[1] + '\n\n'
        if 'Lyrics' in search_options:
            data += A[2] + '\n\n'
        if 'Summaries' in search_options:
            data += A[3] + '\n\n'

        search_data.append(data)
    
    print('Searching titles...Please wait...')
    
    search_match_data = TMIDIX.ascii_texts_search(search_data, search_string)
    search_match_text = search_match_data[0]
    search_match_ratio = search_match_data[1]
    search_match_index = search_data.index(search_match_text)
    
    print('Done!')
    print('=' * 70)
    print('Selected file/title:', AUX_DATA[search_match_index][:2])
    print('=' * 70)

    fn = AUX_DATA[search_match_index][0]
    raw_score = AUX_DATA[search_match_index][4]
    single_track_score_notes = TMIDIX.advanced_score_processor(raw_score, 
                                                               return_score_analysis=False, 
                                                               return_enhanced_score_notes=True)[0]

    print('Sample INTs', raw_score[1][:5])
    print('=' * 70)
 
    x = []
    y = []
    c = []
    
    colors = ['red', 'yellow', 'green', 'cyan',
            'blue', 'pink', 'orange', 'purple',
            'gray', 'white', 'gold', 'silver',
            'lightgreen', 'indigo', 'maroon', 'turquoise']
    
    for s in single_track_score_notes:
        x.append(s[1])
        y.append(s[4])
        c.append(colors[s[3]])

    plt.close()
    plt.figure(figsize=(14,5))
    ax=plt.axes(title='MIDI Match Plot')
    ax.set_facecolor('black')
    
    plt.scatter(x,y, s=0.1, c=c)
    plt.xlabel("Time in MIDI ticks")
    plt.ylabel("MIDI Pitch")

    with open(fn+'.mid', 'wb') as f:
        f.write(TMIDIX.score2midi(raw_score))
    audio = midi_to_colab_audio(fn+'.mid', 
                        soundfont_path=soundfont_path, 
                        sample_rate=16000, # 44100
                        volume_scale=10,
                        output_for_gradio=True
                        )
    yield AUX_DATA[search_match_index][0], fn+'.mid', (16000, audio), plt

#==========================================================================================================

if __name__ == "__main__":
    parser = argparse.ArgumentParser()
    parser.add_argument("--share", action="store_true", default=False, help="share gradio app")
    parser.add_argument("--port", type=int, default=7860, help="gradio server port")
    parser.add_argument("--max-gen", type=int, default=1024, help="max")
    
    opt = parser.parse_args()
    
    soundfont_path = "SGM-v2.01-YamahaGrand-Guit-Bass-v2.7.sf2"
    meta_data_path = "English_Karaoke_Files_Titles_Lyrics_Summaries_Scores_Final.pickle"

    print('Loading meta-data...')
    with open(meta_data_path, 'rb') as f:
        AUX_DATA = pickle.load(f)
    print('Done!')
    
    app = gr.Blocks()
    with app:
        gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>Karaoke MIDI Search</h1>")
        gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>Search and explore 5865 select Karaoke MIDI titles</h1>")
        
        gr.Markdown("![Visitors](https://api.visitorbadge.io/api/visitors?path=asigalov61.Karaoke-MIDI-Search&style=flat)\n\n"
                    "Los Angeles MIDI Dataset Demo\n\n"
                    "Please see [Los Angeles MIDI Dataset](https://github.com/asigalov61/Los-Angeles-MIDI-Dataset) for more information and features\n\n"
                    "[Open In Colab]"
                    "(https://colab.research.google.com/github/asigalov61/Los-Angeles-MIDI-Dataset/blob/main/Los_Angeles_MIDI_Dataset_Search_and_Explore.ipynb)"
                    " for all features"
                    )
        
        search_string = gr.Textbox(label="Enter search prompt here", value="And Nothing Else Matters")
        search_options = gr.CheckboxGroup(["Titles", "Lyrics", "Summaries"], value="Lyrics", label="Search within", info="Where to search?")
        submit = gr.Button()

        gr.Markdown("# Search results")

        output_midi_seq = gr.Textbox(label="Found MIDI search title")
        output_audio = gr.Audio(label="Output MIDI search sample audio", format="mp3", elem_id="midi_audio")
        output_plot = gr.Plot(label="Output MIDI search sample plot")
        output_midi = gr.File(label="Output MIDI search sample MIDI", file_types=[".mid"])
        
        run_event = submit.click(find_midi, [search_string, search_options],
                                                  [output_midi_seq, output_midi, output_audio, output_plot])
        
    app.queue(1).launch(server_port=opt.port, share=opt.share, inbrowser=True)