-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathapp.py
More file actions
72 lines (57 loc) · 2.41 KB
/
Copy pathapp.py
File metadata and controls
72 lines (57 loc) · 2.41 KB
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
from flask import Flask, render_template, request, send_file
import librosa
import numpy as np
from midiutil import MIDIFile
import os
import tempfile
app = Flask(__name__)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/convert', methods=['POST'])
def convert():
if 'file' not in request.files:
return {'error': 'No file uploaded'}, 400
file = request.files['file']
if file.filename == '':
return {'error': 'No file selected'}, 400
if not file.filename.endswith('.mp3'):
return {'error': 'File must be in MP3 format'}, 400
try:
# Sauvegarder le fichier temporairement
temp_mp3 = tempfile.NamedTemporaryFile(delete=False, suffix='.mp3')
file.save(temp_mp3.name)
# Charger l'audio avec librosa
audio, sr = librosa.load(temp_mp3.name)
# Extraire les caractéristiques audio
pitches, magnitudes = librosa.piptrack(y=audio, sr=sr)
# Créer le fichier MIDI
midi_file = tempfile.NamedTemporaryFile(delete=False, suffix='.mid')
midi = MIDIFile(1) # Un seul track
midi.addTempo(0, 0, 120) # Track 0, temps 0, tempo 120 BPM
# Convertir les hauteurs en notes MIDI
for time_idx in range(pitches.shape[1]):
pitch_idx = magnitudes[:, time_idx].argmax()
pitch = pitches[pitch_idx, time_idx]
if pitch > 0: # Si une note est détectée
# Convertir la fréquence en note MIDI
midi_note = int(round(69 + 12 * np.log2(pitch / 440.0)))
# Limiter les notes à la plage MIDI valide (0-127)
midi_note = max(0, min(127, midi_note))
# Calculer le temps en secondes
time = time_idx * 512/sr
# Ajouter la note (track 0, channel 0, pitch, time, duration, volume)
midi.addNote(0, 0, midi_note, time, 0.1, 100)
# Sauvegarder le fichier MIDI
with open(midi_file.name, 'wb') as f:
midi.writeFile(f)
# Nettoyer le fichier MP3 temporaire
os.unlink(temp_mp3.name)
return send_file(
midi_file.name,
mimetype='audio/midi',
as_attachment=True,
download_name='converted.mid'
)
except Exception as e:
return {'error': str(e)}, 500