← Tutte le idee Giochi e hobby

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.