File size: 5,576 Bytes
c10c249
cc4a711
c10c249
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c5824b7
 
c10c249
 
 
 
2dbbde3
 
 
 
c5824b7
 
 
 
 
7a2e83a
c5824b7
 
 
 
 
 
 
c10c249
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7724541
c10c249
7724541
c10c249
7724541
c10c249
 
 
 
 
7724541
c10c249
c5824b7
 
 
5e34946
7724541
c5824b7
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c10c249
c5824b7
c10c249
41705b0
c10c249
 
 
4d700d3
 
 
c10c249
 
 
c5824b7
 
c10c249
 
 
 
 
 
 
 
 
c5824b7
c10c249
 
 
 
 
 
 
 
 
 
 
c5824b7
 
 
 
 
b49f486
c10c249
 
 
cc4a711
41705b0
c10c249
cc4a711
c10c249
 
 
 
 
 
 
5015e4e
c10c249
cc4a711
c10c249
c5824b7
27814ce
c10c249
cc4a711
c10c249
 
c5824b7
c10c249
 
 
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
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
#================================================================
# https://huggingface.co/spaces/asigalov61/MIDI-Identification
#================================================================

import os
import hashlib

import time
import datetime
from pytz import timezone

import copy
from collections import Counter
import random
import statistics

import gradio as gr

from huggingface_hub import InferenceClient

import TMIDIX

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

HF_TOKEN = os.getenv('HF_TOKEN')

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

def format_table_data(data_string):
    # Split the string into rows based on newlines
    rows = data_string.strip().split("\n")

    # Split each row into columns based on the separator '|' and strip extra spaces
    data_list = [row.split("|") for row in rows]
    formatted_data = [[cell.strip() for cell in row] for row in data_list]

    return formatted_data

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

def ID_MIDI(input_midi):
    
    print('*' * 70)
    print('Req start time: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now(PDT)))
    start_time = time.time()
    
    print('=' * 70)
    print('Loading MIDI...')

    fn = os.path.basename(input_midi)
    fn1 = fn.split('.')[0]

    fdata = open(input_midi, 'rb').read()

    input_midi_md5hash = hashlib.md5(fdata).hexdigest()
    
    print('=' * 70)
    print('Requested settings:')
    print('=' * 70)
    print('Input MIDI file name:', fn)
    print('Input MIDI md5 hash', input_midi_md5hash)
    print('=' * 70)
    print('Processing MIDI...Please wait...')
    
    #=======================================================
    # START PROCESSING

    new_midi_data = TMIDIX.score2midi(TMIDIX.midi2score(fdata))
    
    new_midi_md5hash = hashlib.md5(new_midi_data).hexdigest()

    print('New md5 hash:', new_midi_md5hash)
    
    print('Done!')
    print('=' * 70)
    print('Processing...Please wait...')

    if new_midi_md5hash in MIDID_database:

        client = InferenceClient(api_key=HF_TOKEN)
        
        prompt = "Please create a summary table for a MIDI file based on the following keywords strings. Please add best possible description and best possible summary fields. Please respond with the table only. Do not say anything else. Thank you."

        data = MIDID_database[new_midi_md5hash][0]['midi_path']
        
        messages = [
        	{
        		"role": "user",
        		"content": prompt + "\n\n" + data
        	}
        ]
    
        completion = client.chat.completions.create(
            #model="Qwen/Qwen2.5-72B-Instruct",
            model="mistralai/Mistral-Nemo-Instruct-2407",
        	messages=messages, 
        	max_tokens=500
        )
    
        output_str = completion.choices[0].message['content']
    
        output_table_data = format_table_data(output_str)

    else:

        output_table_data = [['No matching MIDI ID records found', 'Unknown MIDI', 'Sorry :(']]
    
    print('Done!')
    print('=' * 70)
    
    print(output_str)
    print('=')

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

    output_midi_md5 = str(input_midi_md5hash)
   
    #========================================================

    print('Req end time: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now(PDT)))
    print('-' * 70)
    print('Req execution time:', (time.time() - start_time), 'sec')
    print('*' * 70)
    
    #========================================================
    
    return output_midi_md5, output_table_data
    
#==========================================================================================================

if __name__ == "__main__":

    PDT = timezone('US/Pacific')
    
    print('=' * 70)
    print('App start time: {:%Y-%m-%d %H:%M:%S}'.format(datetime.datetime.now(PDT)))
    print('=' * 70)

    print('Loading MIDID database...')
    MIDID_database = TMIDIX.Tegridy_Any_Pickle_File_Reader('MIDID_Basic_Database_CC_BY_NC_SA.pickle')
    
    print('=' * 70)

    app = gr.Blocks()
    
    with app:
        
        gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>MIDI Identification</h1>")
        gr.Markdown("<h1 style='text-align: center; margin-bottom: 1rem'>Identify any MIDI in a comprehensive database of 1.42M+ MIDI records</h1>")
        
        gr.Markdown("This is a demo for tegridy-tools\n\n"
                    "Please see [tegridy-tools](https://github.com/asigalov61/tegridy-tools) GitHub repo for more information\n\n"
                   )
        
        gr.Markdown("## Upload your MIDI")
        
        input_midi = gr.File(label="Input MIDI", file_types=[".midi", ".mid", ".kar"], type="filepath")

        submit = gr.Button("Identify MIDI", variant="primary")

        gr.Markdown("## MIDI identification results")
        
        output_midi_md5 = gr.Textbox(label="Input MIDI md5 hash")
        output_MIDID_results_table = gr.Dataframe(label="MIDID results table", wrap=True, col_count=(3, 'dynamic'))
        
        run_event = submit.click(ID_MIDI, [input_midi,                                         
                                              ],
                                                [output_midi_md5, 
                                                    output_MIDID_results_table 
                                                ])
        
    app.queue().launch()