Open this lesson in your favourite AI. It'll walk you through the why, explain the demo, and quiz you on the try-it list.
You will not become good at AI music by reading. You'll become good by generating 30 tracks and analyzing each. This task is the meta-challenge for Module 1: commit to a 30-day daily generation practice. Rules: one track per day (any length, any tool), scored on the slop checklist, kept or trashed with notes on WHY. At day 30 you'll have 30 tracks, a personal genre-affinity picture, a working sense of prompt iteration, and a taste ceiling you can hear moving. Every subsequent module of this course assumes you've built this ear.
The 30-day tracker + a Sunday-review template.
Use these three in order. Each builds on the one before.
In one paragraph, explain why 30 daily tracks matter more than 5 polished ones.
Walk me through what improves in 30 days: your ear, your prompts, or the tool? All three, but in what order?
My day-15 tracks aren't visibly better than day-2. Is the practice not working, or am I plateauing? Design a diagnostic.
# 30-day tracker — one row per track.
import json
from pathlib import Path
TRACKER_PATH = Path.home() / "ai-music-30day.jsonl"
def log_track(day: int, tool: str, prompt: str, slop_score: int, verdict: str, keep: bool):
entry = {
"day": day, "tool": tool, "prompt": prompt,
"slop_score": slop_score, "verdict": verdict, "keep": keep,
"logged_at": __import__("datetime").datetime.now().isoformat(),
}
with open(TRACKER_PATH, "a") as f:
f.write(json.dumps(entry) + "\n")
def weekly_review():
"""Print a Sunday-review summary of the week."""
from datetime import datetime, timedelta
week_ago = datetime.now() - timedelta(days=7)
entries = []
with open(TRACKER_PATH) as f:
for line in f:
e = json.loads(line)
if datetime.fromisoformat(e["logged_at"]) >= week_ago:
entries.append(e)
if not entries: return "No entries this week."
keeps = sum(1 for e in entries if e["keep"])
avg_slop = sum(e["slop_score"] for e in entries) / len(entries)
tools = {}
for e in entries: tools[e["tool"]] = tools.get(e["tool"], 0) + 1
return f"""Week review ({len(entries)} tracks):
keepers: {keeps}/{len(entries)}
avg slop score: {avg_slop:.1f}
tools used: {tools}"""
# Day 1 example
log_track(1, "Suno", "melancholic downtempo, Rhodes piano, 85 BPM", slop_score=3, verdict="borderline", keep=True)
print(weekly_review())
python3 main.py