Lend Me Your Ears
Un gioco di memoria per imparare a suonare il piano a orecchio
Cosa fa
Si ascolta una breve melodia e la si deve ripetere sulla tastiera: un gioco che allena l'orecchio musicale.
Come guadagna
Presentato su Hacker News dal suo creatore, che non dichiara incassi. Idee nostre per guadagnare con un progetto simile: livelli e canzoni a pagamento, versione per scuole di musica.
Rendilo tuo
- Con melodie famose italiane e canzoni per bambini.
- Versione per chitarra o per la voce.
Le frasi da scrivere all'AI
1. Base del sito e grafica
Crea un'app web in italiano chiamata "Orecchio Allenato": un gioco che allena l'orecchio musicale: si ascolta una breve melodia e la si ripete sulla tastiera sullo schermo, o su una tastiera MIDI collegata, livello dopo livello. Usa React, Vite, TypeScript e Tailwind CSS.
Pagine da creare:
1. Pagina iniziale con "Prova subito"
2. Esercizio: ascolta, ripeti sulla tastiera, vedi gli errori
3. Livelli: da 2 note a frasi di 8 note, con salti e ritmi
4. Statistiche: precisione per intervallo
5. Pagina Pro
Stile: musicale e luminoso: sfondo blu notte #0F172A, tasti bianchi e neri realistici, verde #22C55E per le note giuste e rosso #F43F5E per quelle sbagliate, carattere "Inter". 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:
- "risultati": livello, melodia, note giuste, tentativi, data, collegati all'utente
- "profili": piano
Regole di sicurezza obbligatorie:
- ogni utente vede solo i suoi risultati
- il piano non si modifica 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. Ascolta e ripeti
Il gioco genera una melodia breve adatta al livello (note vicine all'inizio, poi salti più grandi) e la suona con il Web Audio API. Il giocatore la ripete sulla tastiera a schermo, con la tastiera del computer (una fila di tasti = un'ottava) o con una tastiera MIDI collegata via USB (Web MIDI API, codice nei Dettagli tecnici).
Ogni nota suonata si confronta subito: verde se giusta, rossa se sbagliata, con la nota giusta mostrata. Si può riascoltare la melodia 3 volte.
Statistiche per intervallo (seconda, terza, quinta, ottava): mostrano dove l'orecchio sbaglia di più, e i livelli successivi insistono su quelli.
4. Livelli e Pro
30 livelli: melodie di 2–8 note, solo tasti bianchi, poi anche neri, poi ritmi diversi. Ogni giorno una "melodia del giorno" uguale per tutti.
Pro: tutti i livelli, melodie di canzoni popolari di pubblico dominio, esercizi sugli accordi, e statistiche complete.
5. Pagamenti con Stripe
Aggiungi un pagamento singolo di 4,99 € una volta sola. Il pagamento sblocca tutti i livelli, le melodie popolari, gli accordi e le statistiche complete.
A pagamento riuscito il webhook imposta "piano" a "pro" nella tabella "profili", sulla riga dell'utente indicata in client_reference_id.
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. MIDI: collega una tastiera MIDI (anche economica) e controlla che ogni tasto premuto venga riconosciuto con la nota giusta.
Correggi quello che non va e scrivimi cosa hai cambiato.
Dettagli tecnici
Suonare le note e leggere una tastiera MIDI
Suona una nota con un oscillatore morbido e ascolta i tasti premuti su una tastiera MIDI collegata al computer.
const freq = (midi: number) => 440 * Math.pow(2, (midi - 69) / 12); // 69 = La4
export function suonaNota(audio: AudioContext, midi: number, quando = audio.currentTime, durata = 0.5) {
const osc = audio.createOscillator();
const vol = audio.createGain();
osc.type = "triangle";
osc.frequency.value = freq(midi);
vol.gain.setValueAtTime(0, quando);
vol.gain.linearRampToValueAtTime(0.35, quando + 0.01); // attacco
vol.gain.exponentialRampToValueAtTime(0.001, quando + durata); // rilascio
osc.connect(vol).connect(audio.destination);
osc.start(quando);
osc.stop(quando + durata);
}
export function suonaMelodia(audio: AudioContext, note: number[], battito = 0.5) {
note.forEach((n, i) => suonaNota(audio, n, audio.currentTime + i * battito, battito * 0.9));
}
// Tastiera MIDI: chiama onNota con il numero della nota premuta
export async function ascoltaMidi(onNota: (midi: number) => void) {
if (!("requestMIDIAccess" in navigator)) return false;
const accesso = await navigator.requestMIDIAccess();
for (const ingresso of accesso.inputs.values()) {
ingresso.onmidimessage = (e) => {
const [stato, nota, velocita] = e.data!;
if ((stato & 0xf0) === 0x90 && velocita > 0) onNota(nota); // "nota premuta"
};
}
return true;
}
Pezzi comuni a tutti i progetti
Glossario
- MIDI
- Il linguaggio con cui strumenti elettronici e computer si scambiano le note suonate.
- Intervallo
- La distanza tra due note: riconoscerla a orecchio è la base per suonare senza spartito.