BeatMind
Separa una canzone in voce, batteria e strumenti, con gli accordi già scritti
Cosa fa
Divide una canzone nelle sue tracce (voce, batteria, basso, altri strumenti) e mostra la struttura del brano e gli accordi.
Come guadagna
Startup appena presentata su BetaList, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: abbonamento per musicisti, crediti per brano.
Rendilo tuo
- Per chi suona nelle band di cover: la base senza il proprio strumento per esercitarsi.
- Per i cori: la parte di ogni voce da ascoltare separata.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Tracce Separate": divide una canzone nelle sue tracce (voce, batteria, basso, altri strumenti) per studiarla, suonarci sopra o fare karaoke, e mostra la struttura del brano e gli accordi. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con un esempio da ascoltare e prezzi
2. Registrazione e accesso
3. Carica un brano (che possiedi o di cui hai i diritti)
4. Mixer: volume e muto per ogni traccia, velocità senza cambiare tonalità
5. Accordi e struttura (strofa, ritornello) sulla linea del tempo
Stile: da studio musicale: sfondo nero #09090B, un colore per traccia (voce rosa #F472B6, batteria arancio #FB923C, basso blu #60A5FA, altro verde #4ADE80), carattere "Inter", forme d'onda colorate. Nessuna immagine generica di stock.
Tutto deve funzionare perfettamente da telefono. Tutti i testi in italiano, chiari e senza parole tecniche.
2. Database, account e sicurezza
Collega il progetto a Supabase e attiva la registrazione con email e password.
Crea queste tabelle:
- "brani": titolo, file originale e tracce separate nello Storage, accordi e struttura in JSON, stato, collegati all'utente
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi brani
- i file sono privati e non si condividono con altri
- i file si cancellano dopo 30 giorni
- i crediti non si modificano dal browser
Usa esattamente il codice SQL che trovi nei "Dettagli tecnici" di questa scheda: eseguilo nel SQL Editor di Supabase prima di continuare, poi collega le pagine alle tabelle.
3. Separazione delle tracce
La separazione usa Demucs, un modello open source (licenza MIT) che divide un brano in voce, batteria, basso e altro. Gira su un server di lavoro con scheda video (non nelle Edge Function): la Edge Function mette il brano in coda, il server lo elabora in 1–2 minuti e salva le 4 tracce nello Storage privato (comando nei Dettagli tecnici).
Il mixer nel browser fa suonare le 4 tracce insieme con il Web Audio API: volume e muto per traccia, velocità rallentata per studiare senza cambiare tonalità, e ripetizione di un pezzo.
Regola chiara al caricamento: solo brani che possiedi o di cui hai i diritti, per uso personale di studio. Le tracce non si possono condividere né pubblicare dal sito.
4. Accordi e struttura
Sulla traccia "altro" e sul basso si stimano gli accordi e la struttura (strofa, ritornello, ponte), mostrati sulla linea del tempo e utili per suonare il brano; sono stime e si possono correggere.
Pulsante "Karaoke" (tutto tranne la voce) e "Suona tu" (tutto tranne lo strumento scelto). I file si cancellano da soli dopo 30 giorni.
5. Pagamenti con Stripe
Aggiungi pacchetti di crediti: 10 brani a 7,99 €, 40 brani a 24,99 €. Ogni nuovo utente riceve 2 crediti gratis. Ogni brano separato costa un credito. Mostra sempre in alto quanti crediti restano e, quando finiscono, un riquadro per comprarne altri.
A pagamento riuscito il webhook aggiunge i crediti del pacchetto con la funzione aggiungi_crediti.
Per la sessione di pagamento e il webhook segui la guida "Pagamenti con Stripe" di Fattibile.
6. Controlli specifici di questo progetto
Oltre ai controlli della guida "Controllo finale", verifica in particolare:
1. Diritti: verifica che non esista nessun modo di condividere le tracce con altri utenti o di renderle pubbliche.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Separare un brano con Demucs
Il lavoro che gira sul server con scheda video: scarica il brano dalla coda, lo separa in 4 tracce con Demucs e le ricarica nello Storage privato.
# lavoratore.py - gira sul server con GPU
import subprocess, pathlib, tempfile
from supabase import create_client
import os
db = create_client(os.environ["SUPABASE_URL"], os.environ["SUPABASE_SERVICE_ROLE_KEY"])
def separa(brano_id: str, percorso: str):
with tempfile.TemporaryDirectory() as cartella:
ingresso = pathlib.Path(cartella) / "brano.mp3"
ingresso.write_bytes(db.storage.from_("brani").download(percorso))
# 4 tracce: vocals, drums, bass, other (modello htdemucs)
subprocess.run(
["demucs", "-n", "htdemucs", "--mp3", "-o", cartella, str(ingresso)],
check=True,
)
uscita = pathlib.Path(cartella) / "htdemucs" / "brano"
cartella_utente = percorso.split("/")[0]
tracce = {}
for nome in ["vocals", "drums", "bass", "other"]:
destinazione = f"{cartella_utente}/{brano_id}/{nome}.mp3"
db.storage.from_("brani").upload(destinazione, (uscita / f"{nome}.mp3").read_bytes())
tracce[nome] = destinazione
db.table("brani").update({"tracce": tracce, "stato": "pronto"}).eq("id", brano_id).execute()Suonare le tracce insieme
Carica le 4 tracce, le fa partire nello stesso istante e dà a ognuna il suo volume, per il mixer nel browser.
export async function mixer(audio: AudioContext, url: Record<string, string>) {
const tracce = await Promise.all(Object.entries(url).map(async ([nome, u]) => {
const buffer = await audio.decodeAudioData(await (await fetch(u)).arrayBuffer());
const volume = audio.createGain();
volume.connect(audio.destination);
return { nome, buffer, volume };
}));
let sorgenti: AudioBufferSourceNode[] = [];
return {
suona(daSecondo = 0, velocita = 1) {
sorgenti.forEach((s) => s.stop());
const quando = audio.currentTime + 0.1; // tutte nello stesso istante
sorgenti = tracce.map((t) => {
const s = audio.createBufferSource();
s.buffer = t.buffer;
s.playbackRate.value = velocita; // per la velocità senza cambiare tonalità serve un time-stretch
s.connect(t.volume);
s.start(quando, daSecondo);
return s;
});
},
volume: (nome: string, valore: number) => {
tracce.find((t) => t.nome === nome)!.volume.gain.value = valore; // 0 = muto
},
ferma: () => sorgenti.forEach((s) => s.stop()),
};
}
Pezzi comuni a tutti i progetti
Glossario
- Storage
- Lo spazio di Supabase dove si salvano i file, come foto e audio, con le sue regole di accesso.
- Demucs
- Un modello open source che separa una canzone nelle sue tracce: voce, batteria, basso e altri strumenti.
- Stem
- Una traccia separata di un brano, per esempio solo la voce o solo la batteria.