← Tutte le idee Giochi e hobby

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.