import { useState } from "react"; const chapters = [ { id: 0, emoji: "๐ŸŽต", title: "์—์ด๋ธ”ํ†ค์ด ๋ญ์˜ˆ์š”?", color: "#7F77DD", light: "#EEEDFE", dark: "#3C3489", render: () => { const [flip, setFlip] = useState(null); const cards = [ { q: "์—์ด๋ธ”ํ†ค์€\n๋ญ์˜ˆ์š”?", a: "์ปดํ“จํ„ฐ๋กœ ์Œ์•…์„ ๋งŒ๋“œ๋Š” ํ”„๋กœ๊ทธ๋žจ์ด์—์š”!\n๋ ˆ๊ณ ์ฒ˜๋Ÿผ ์†Œ๋ฆฌ ๋ธ”๋ก์„ ์Œ“์•„์„œ ๋…ธ๋ž˜๋ฅผ ๋งŒ๋“ค์–ด์š” ๐ŸŽฎ", emoji: "๐Ÿ’ป" }, { q: "๋ˆ„๊ฐ€\n์จ์š”?", a: "DJ, ์ž‘๊ณก๊ฐ€, ์œ ํŠœ๋ฒ„, ๊ฒŒ์ž„ ์Œ์•… ๋งŒ๋“œ๋Š” ์‚ฌ๋žŒ ๋“ฑ\n์ „ ์„ธ๊ณ„ ์ˆ˜๋ฐฑ๋งŒ ๋ช…์ด ์“ฐ๊ณ  ์žˆ์–ด์š”! ๐ŸŒ", emoji: "๐ŸŽค" }, { q: "์–ด๋ ต์ง€\n์•Š์•„์š”?", a: "์ฒ˜์Œ์—” ๋‚ฏ์„ค์ง€๋งŒ ์ฐจ๊ทผ์ฐจ๊ทผ ํ•˜๋ฉด ๋ผ์š”!\n์ด ๊ฐ€์ด๋“œ๋ฅผ ๋”ฐ๋ผํ•˜๋ฉด ๋ˆ„๊ตฌ๋‚˜ ํ•  ์ˆ˜ ์žˆ์–ด์š” ๐Ÿ’ช", emoji: "๐Ÿ˜Š" }, { q: "๋ญ˜ ๋งŒ๋“ค\n์ˆ˜ ์žˆ์–ด์š”?", a: "ํž™ํ•ฉ, ํŒ, ์ „์ž์Œ์•…, ๊ฒŒ์ž„ BGM, ์œ ํŠœ๋ธŒ ๋ฐฐ๊ฒฝ์Œ์•…\n๋ญ๋“  ๋งŒ๋“ค ์ˆ˜ ์žˆ์–ด์š”! ๐ŸŽธ", emoji: "๐ŸŽผ" }, ]; return (
๐ŸŽน
์—์ด๋ธ”ํ†ค = ์Œ์•… ๋ ˆ๊ณ !
์†Œ๋ฆฌ ๋ธ”๋ก๋“ค์„ ๋ชจ์•„์„œ ์กฐํ•ฉํ•˜๋ฉด
๋‚ด ๋…ธ๋ž˜๊ฐ€ ์™„์„ฑ๋ผ์š”!
๐Ÿ‘† ์นด๋“œ๋ฅผ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”!
{cards.map((card, i) => (
setFlip(flip === i ? null : i)} style={{ borderRadius: 14, border: `2px solid ${flip === i ? "#7F77DD" : "#e0e0e0"}`, padding: 16, cursor: "pointer", background: flip === i ? "#EEEDFE" : "#fff", transition: "all .2s", minHeight: 100, display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center" }}>
{card.emoji}
{flip === i ? (
{card.a}
) : (
{card.q}
)}
))}
๐Ÿ’ก ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ!
์—์ด๋ธ”ํ†ค์€ ์Œ์•… ์š”๋ฆฌ์ฑ…์ด์—์š”.
์žฌ๋ฃŒ(์†Œ๋ฆฌ) ๋ฅผ ๊ณจ๋ผ์„œ โ†’ ์ˆœ์„œ๋Œ€๋กœ ๋‹ด๊ณ  โ†’ ๋ง›์žˆ๋Š” ๋…ธ๋ž˜ ์™„์„ฑ! ๐Ÿณ
); } }, { id: 1, emoji: "๐Ÿ–ฅ๏ธ", title: "ํ™”๋ฉด ๊ตฌ๊ฒฝํ•˜๊ธฐ", color: "#1D9E75", light: "#E1F5EE", dark: "#085041", render: () => { const [sel, setSel] = useState(null); const parts = [ { id: 0, x: 0, y: 0, w: 620, h: 44, label: "โ‘  ์ปจํŠธ๋กค ๋ฐ”", color: "#7F77DD", desc: "์žฌ์ƒโ–ถ ์ •์ง€โ–  ๋…น์Œโ— ๋ฒ„ํŠผ์ด ์—ฌ๊ธฐ ์žˆ์–ด์š”!\n๋ฐ•์ž(BPM)๋„ ์—ฌ๊ธฐ์„œ ๋ฐ”๊ฟ”์š”. ์Œ์•…์˜ '๋ฆฌ๋ชจ์ปจ'์ด์—์š” ๐ŸŽฎ" }, { id: 1, x: 0, y: 44, w: 110, h: 200, label: "โ‘ก ํŒŒ์ผ ์ฐฝ", color: "#1D9E75", desc: "๋“œ๋Ÿผ, ํ”ผ์•„๋…ธ, ๊ธฐํƒ€ ๋“ฑ ๋ชจ๋“  ์†Œ๋ฆฌ๊ฐ€ ์—ฌ๊ธฐ ์žˆ์–ด์š”!\n๋งˆํŠธ์ฒ˜๋Ÿผ ์›ํ•˜๋Š” ์†Œ๋ฆฌ๋ฅผ ๊ณจ๋ผ์„œ ๊บผ๋‚ด์š” ๐Ÿ›’" }, { id: 2, x: 110, y: 44, w: 510, h: 100, label: "โ‘ข ์„ธ์…˜ ๋ทฐ", color: "#BA7517", desc: "๊ฒฉ์ž ๋ชจ์–‘ ํ™”๋ฉด์ด์—์š”!\n๋ฒ„ํŠผ์ฒ˜๋Ÿผ ์†Œ๋ฆฌ ๋ธ”๋ก์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ˆŒ๋Ÿฌ์„œ ์ฆ‰ํฅ ์—ฐ์ฃผํ•ด์š” ๐ŸŽธ" }, { id: 3, x: 110, y: 144, w: 510, h: 100, label: "โ‘ฃ ์–ด๋ ˆ์ธ์ง€ ๋ทฐ", color: "#D85A30", desc: "์™ผ์ชฝโ†’์˜ค๋ฅธ์ชฝ์œผ๋กœ ์‹œ๊ฐ„์ด ํ˜๋Ÿฌ์š”!\n์—ฌ๊ธฐ์„œ ์™„์„ฑ๋œ ๊ณก์˜ ์ˆœ์„œ๋ฅผ ๋งŒ๋“ค์–ด์š” ๐Ÿ“" }, { id: 4, x: 0, y: 244, w: 620, h: 50, label: "โ‘ค ํด๋ฆฝ/์žฅ์น˜ ์ฐฝ", color: "#185FA5", desc: "์†Œ๋ฆฌ๋ฅผ ์ž์„ธํžˆ ์ˆ˜์ •ํ•˜๋Š” ๊ณณ์ด์—์š”!\n์Œํ‘œ๋ฅผ ์ง์ ‘ ๊ทธ๋ ค ๋„ฃ๊ฑฐ๋‚˜ ์Œ์ƒ‰์„ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ์–ด์š” ๐ŸŽจ" }, ]; const s = sel !== null ? parts[sel] : null; return (

์—์ด๋ธ”ํ†ค ํ™”๋ฉด์€ ํฌ๊ฒŒ 5๊ฐœ ๊ตฌ์—ญ์œผ๋กœ ๋‚˜๋‰˜์–ด์š”.
์•„๋ž˜ ๊ฐ ๊ตฌ์—ญ์„ ๋ˆŒ๋Ÿฌ๋ณด๋ฉด ์„ค๋ช…์ด ๋‚˜์™€์š”! ๐Ÿ‘†

{parts.map(p => ( setSel(sel === p.id ? null : p.id)} style={{ cursor: "pointer" }}> {p.label} ))} {s ? (
{s.label}
{s.desc}
) : (
์œ„ ๊ตฌ์—ญ์„ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”! โ˜๏ธ
)}
๐Ÿ’ก Tab ํ‚ค๋ฅผ ๋ˆ„๋ฅด๋ฉด ์„ธ์…˜ ๋ทฐ โ†” ์–ด๋ ˆ์ธ์ง€ ๋ทฐ๋ฅผ ์™”๋‹ค๊ฐ”๋‹ค ํ•  ์ˆ˜ ์žˆ์–ด์š”!
); } }, { id: 2, emoji: "๐Ÿฅ", title: "๋“œ๋Ÿผ ์ฐ๊ธฐ", color: "#D85A30", light: "#FAECE7", dark: "#712B13", render: () => { const init = { kick: [1,0,0,0,0,0,1,0,1,0,0,0,0,0,0,0], snare: [0,0,0,0,1,0,0,0,0,0,0,0,1,0,0,0], hihat: [1,0,1,0,1,0,1,0,1,0,1,0,1,0,1,0], }; const [pads, setPads] = useState(init); const toggle = (inst, i) => setPads(p => ({ ...p, [inst]: p[inst].map((v, idx) => idx === i ? v ^ 1 : v) })); const reset = () => setPads(init); const rows = [ { key: "kick", emoji: "๐Ÿฆต", name: "ํ‚ฅ ๋“œ๋Ÿผ", desc: "์ฟต์ฟต! 1๋ฒˆยท3๋ฒˆ ๋ฐ•์ž์—", color: "#7F77DD" }, { key: "snare", emoji: "๐Ÿ’ฅ", name: "์Šค๋„ค์–ด", desc: "๋”ฑ๋”ฑ! 2๋ฒˆยท4๋ฒˆ ๋ฐ•์ž์—", color: "#1D9E75" }, { key: "hihat", emoji: "๐ŸŽฉ", name: "ํ•˜์ดํ–‡", desc: "์น˜์น˜์น˜! ๋น ๋ฅด๊ฒŒ ์ „์ฒด์—", color: "#BA7517" }, ]; const beats = [1, 2, 3, 4]; return (

๋“œ๋Ÿผ์€ ์Œ์•…์˜ ์‹ฌ์žฅ๋ฐ•๋™์ด์—์š”! ๐Ÿซ€
์„ธ ๊ฐ€์ง€ ์†Œ๋ฆฌ๋งŒ ์žˆ์œผ๋ฉด ๊ธฐ๋ณธ ๋“œ๋Ÿผ์ด ์™„์„ฑ๋ผ์š”.

{rows.map(r => (
{r.emoji}
{r.name}
{r.desc}
))}
{beats.map(b => [0,1,2,3].map(s => (
{s === 0 ? `${b}๋ฐ•` : ""}
)))}
{rows.map(row => (
{row.emoji} {row.name.split(" ")[0]}
{pads[row.key].map((on, i) => (
{i % 4 === 0 && i > 0 &&
}
toggle(row.key, i)} style={{ width: 24, height: 24, borderRadius: 5, background: on ? row.color : "#333", border: `1.5px solid ${on ? row.color : "#444"}`, cursor: "pointer", transition: "all .1s", marginRight: 4 }} />
))}
))}
๐ŸŽฎ ์—์ด๋ธ”ํ†ค์—์„œ ํ•˜๋Š” ๋ฒ•!
1. MIDI ํŠธ๋ž™ ๋งŒ๋“ค๊ธฐ (์šฐํด๋ฆญ โ†’ Insert MIDI Track)
2. ํŒŒ์ผ ์ฐฝ โ†’ Drums โ†’ ๋“œ๋Ÿผ ํ‚ท ๋“œ๋ž˜๊ทธ
3. ํŠธ๋ž™์— ํด๋ฆฝ ๋”๋ธ”ํด๋ฆญ ์ƒ์„ฑ
4. ํด๋ฆฝ ๋”๋ธ”ํด๋ฆญ โ†’ ํ”ผ์•„๋…ธ ๋กค ์—ด๋ฆผ
5. ์œ„ ํŒจํ„ด์ฒ˜๋Ÿผ ์Œํ‘œ ์ฐ๊ธฐ!
); } }, { id: 3, emoji: "๐ŸŽน", title: "์ฝ”๋“œ(ํ™”์Œ) ์ดํ•ดํ•˜๊ธฐ", color: "#7F77DD", light: "#EEEDFE", dark: "#3C3489", render: () => { const [selChord, setSelChord] = useState(0); const [pressed, setPressed] = useState([]); const notes = ["C","C#","D","D#","E","F","F#","G","G#","A","A#","B","C","D","E","F","G","A","B"]; const whiteKeys = [0,2,4,5,7,9,11,12,14,16,17,19,21,23]; const blackKeys = [1,3,null,6,8,10,null,13,15,null,18,20,22]; const blackLabels = ["C#","D#","","F#","G#","A#","","C#","D#","","F#","G#","A#"]; const chords = [ { name: "C ์ฝ”๋“œ (๋„๋ฏธ์†”)", notes: ["C","E","G"], feel: "๋ฐ๊ณ  ํ–‰๋ณตํ•œ ๋А๋‚Œ โ˜€๏ธ", color: "#7F77DD", indices: [0,4,7] }, { name: "G ์ฝ”๋“œ (์†”์‹œ๋ ˆ)", notes: ["G","B","D"], feel: "ํž˜์ฐจ๊ณ  ์‹ ๋‚˜๋Š” ๋А๋‚Œ ๐Ÿ’ช", color: "#1D9E75", indices: [7,11,14] }, { name: "Am ์ฝ”๋“œ (๋ผ๋„๋ฏธ)", notes: ["A","C","E"], feel: "์Šฌํ”„๊ณ  ๊ฐ์„ฑ์ ์ธ ๋А๋‚Œ ๐ŸŒ™", color: "#D85A30", indices: [9,12,16] }, { name: "F ์ฝ”๋“œ (ํŒŒ๋ผ๋„)", notes: ["F","A","C"], feel: "๋”ฐ๋œปํ•˜๊ณ  ์•ˆ์ •์ ์ธ ๋А๋‚Œ ๐ŸŒธ", color: "#BA7517", indices: [5,9,12] }, ]; const ch = chords[selChord]; return (

์ฝ”๋“œ๋Š” ์—ฌ๋Ÿฌ ์Œ์„ ๋™์‹œ์— ๋ˆ„๋ฅด๋Š” ๊ฒƒ์ด์—์š”!
์Œ๋“ค์ด ํ•จ๊ป˜ ์šธ๋ฆฌ๋ฉด ํŠน๋ณ„ํ•œ ๊ฐ์ •์ด ์ƒ๊ฒจ์š” ๐ŸŽญ

{chords.map((c, i) => (
setSelChord(i)} style={{ padding: "10px 12px", borderRadius: 12, border: `2px solid ${selChord === i ? c.color : "#eee"}`, background: selChord === i ? `${c.color}18` : "#fff", cursor: "pointer" }}>
{c.name}
{c.feel}
))}
{/* ๊ฑด๋ฐ˜ */}
{ch.color === "#7F77DD" ? "๐ŸŸฃ" : ch.color === "#1D9E75" ? "๐ŸŸข" : ch.color === "#D85A30" ? "๐ŸŸ " : "๐ŸŸก"} {ch.name} โ€” ์ด ๊ฑด๋ฐ˜๋“ค์„ ๋™์‹œ์— ๋ˆŒ๋Ÿฌ์š”!
{whiteKeys.map((semitone, i) => { const noteName = notes[semitone]; const isActive = ch.indices.includes(semitone); return ( {noteName} {isActive && โฌ‡} ); })} {blackKeys.map((semitone, i) => { if (semitone === null) return null; const isActive = ch.indices.includes(semitone); return ( ); })}
{/* ๊ตฌ์„ฑ์Œ */}
{ch.notes.map((n, i) => (
{n}
))}
๐ŸŽน ์—์ด๋ธ”ํ†ค์—์„œ ์ฝ”๋“œ ์ฐ๋Š” ๋ฒ•!
ํ”ผ์•„๋…ธ ๋กค์—์„œ ๊ฐ™์€ ์œ„์น˜์— ์—ฌ๋Ÿฌ ์Œํ‘œ๋ฅผ ์„ธ๋กœ๋กœ ์Œ“์œผ๋ฉด ์ฝ”๋“œ๊ฐ€ ๋ผ์š”!
C์ฝ”๋“œ = C4 + E4 + G4 ๋™์‹œ์— ํด๋ฆญ!
); } }, { id: 4, emoji: "๐ŸŽต", title: "๋ฉœ๋กœ๋”” ๋งŒ๋“ค๊ธฐ", color: "#BA7517", light: "#FAEEDA", dark: "#633806", render: () => { const noteSeq = [ { note: "๋„", key: "C", y: 70, color: "#7F77DD", len: 60 }, { note: "๋ ˆ", key: "D", y: 55, color: "#7F77DD", len: 45 }, { note: "๋ฏธ", key: "E", y: 40, color: "#1D9E75", len: 45 }, { note: "์†”", key: "G", y: 25, color: "#1D9E75", len: 60 }, { note: "๋ฏธ", key: "E", y: 40, color: "#D85A30", len: 45 }, { note: "๋ ˆ", key: "D", y: 55, color: "#D85A30", len: 45 }, { note: "๋„", key: "C", y: 70, color: "#BA7517", len: 80 }, ]; const rules = [ { icon: "๐Ÿ”", title: "์งง๊ฒŒ ์‹œ์ž‘", body: "2~4๊ฐœ ์Œ์œผ๋กœ ์‹œ์ž‘ํ•ด์š”.\n'๋„๋ ˆ๋ฏธ' ์ฒ˜๋Ÿผ ์งง์€ ํŒจํ„ด์„ ๋งŒ๋“ค์–ด์š”." }, { icon: "โ†•๏ธ", title: "์˜ฌ๋ผ๊ฐ”๋‹ค ๋‚ด๋ ค์˜ค๊ธฐ", body: "์Œ์ด ์˜ฌ๋ผ๊ฐ€๋ฉด ์‹ ๋‚˜๊ณ \n๋‚ด๋ ค์˜ค๋ฉด ์•ˆ์ •๋˜๋Š” ๋А๋‚Œ์ด์—์š”." }, { icon: "โธ๏ธ", title: "์‰ฌ๋Š” ๊ตฌ๊ฐ„ ๋„ฃ๊ธฐ", body: "๊ณ„์† ์Œ๋งŒ ๋„ฃ์œผ๋ฉด ๋‹ต๋‹ตํ•ด์š”.\n์ค‘๊ฐ„์— ์‰ผํ‘œ(๋นˆ ๊ณต๊ฐ„)๋ฅผ ๋„ฃ์–ด์š”." }, { icon: "๐Ÿ”„", title: "๋ฐ˜๋ณต + ๋ณ€ํ˜•", body: "๊ฐ™์€ ํŒจํ„ด์„ ๋ฐ˜๋ณตํ•˜๋˜\n๋งˆ์ง€๋ง‰์— ์‚ด์ง ๋‹ฌ๋ฆฌ ๋๋‚ด์š”." }, ]; let xPos = 10; return (

๋ฉœ๋กœ๋””๋Š” ์Œ๋“ค์ด ์ด์–ด์ง€๋Š” ์„ ์œจ์ด์—์š”!
์–ด๋ฆด ๋•Œ ํฅ์–ผ๊ฑฐ๋ฆฌ๋˜ ๋…ธ๋ž˜๊ฐ€ ๋ฐ”๋กœ ๋ฉœ๋กœ๋””์˜ˆ์š” ๐ŸŽถ

{/* ๋ฉœ๋กœ๋”” ์‹œ๊ฐํ™” */}
๐ŸŽต ๋„๋ ˆ๋ฏธ์†”๋ฏธ๋ ˆ๋„ โ€” ์˜ฌ๋ผ๊ฐ”๋‹ค๊ฐ€ ๋‚ด๋ ค์˜ค๋Š” ๋ฉœ๋กœ๋””
{/* ๊ฐ€์ด๋“œ ๋ผ์ธ */} {[25, 40, 55, 70].map(y => ( ))} {/* ์Œํ‘œ ์ด๋ฆ„ ๋ผ๋ฒจ */} {["์†”", "๋ฏธ", "๋ ˆ", "๋„"].map((n, i) => ( {n} ))} {/* ์Œํ‘œ๋“ค */} {noteSeq.map((n, i) => { const x = xPos; xPos += n.len + 8; return ( {n.note} ); })} {/* ์—ฐ๊ฒฐ์„  */} {(() => { let positions = []; let x2 = 10; noteSeq.forEach(n => { positions.push({ x: x2 + (n.len - 4) / 2, y: n.y + 4 }); x2 += n.len + 8; }); return positions.slice(0, -1).map((p, i) => ( )); })()} ์˜ฌ๋ผ๊ฐ”๋‹ค โ†’ ๋‚ด๋ ค์˜ค๋Š” ์ž์—ฐ์Šค๋Ÿฌ์šด ๋ฉœ๋กœ๋””
{rules.map((r, i) => (
{r.icon}
{r.title}
{r.body}
))}
๐ŸŽน ์—์ด๋ธ”ํ†ค์—์„œ ๋ฉœ๋กœ๋”” ์ฐ๋Š” ๋ฒ•!
ํ”ผ์•„๋…ธ ๋กค โ†’ Scale ๋ฒ„ํŠผ ON โ†’ C์žฅ์กฐ ์„ ํƒ
โ†’ ๋…ธ๋ž€ ๊ฑด๋ฐ˜๋งŒ ํด๋ฆญํ•˜๋ฉด ์Œ ์ดํƒˆ ์—†์ด ๋ฉœ๋กœ๋”” ์™„์„ฑ!
); } }, { id: 5, emoji: "๐Ÿ—๏ธ", title: "๋…ธ๋ž˜ ๊ตฌ์กฐ ๋งŒ๋“ค๊ธฐ", color: "#185FA5", light: "#E6F1FB", dark: "#0C447C", render: () => { const [selSec, setSelSec] = useState(null); const sections = [ { label: "์ธํŠธ๋กœ", bars: "4๋งˆ๋””", color: "#888", desc: "๊ณก์˜ ์‹œ์ž‘์ด์—์š”!\n๋“œ๋Ÿผ๋งŒ ๋‚˜์˜ค๊ฑฐ๋‚˜ ์•„์ฃผ ์กฐ์šฉํ•˜๊ฒŒ ์‹œ์ž‘ํ•ด์š”.\n์ฒญ์ค‘์ด '์–ด? ๋ญ” ๋…ธ๋ž˜์ง€?' ํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์š” ๐Ÿคซ", emoji: "๐ŸŽฌ", energy: 2 }, { label: "๋ฒ„์Šค", bars: "8๋งˆ๋””", color: "#7F77DD", desc: "์ด์•ผ๊ธฐ๋ฅผ ๋“ค๋ ค์ฃผ๋Š” ๋ถ€๋ถ„์ด์—์š”!\n๋“œ๋Ÿผ+๋ฒ ์ด์Šค+๋ฉœ๋กœ๋””๊ฐ€ ๋ชจ๋‘ ๋“ค์–ด์™€์š”.\n์ฝ”๋Ÿฌ์Šค๋ณด๋‹ค ์กฐ์šฉํ•ด์š” ๐Ÿ“–", emoji: "๐Ÿ“", energy: 5 }, { label: "์ฝ”๋Ÿฌ์Šค", bars: "8๋งˆ๋””", color: "#D85A30", desc: "๊ฐ€์žฅ ์‹ ๋‚˜๋Š” ๋ถ€๋ถ„์ด์—์š”!\n๋ชจ๋“  ์•…๊ธฐ๊ฐ€ ์ตœ๋Œ€๋กœ ๋‚˜์™€์š”.\n'ํ›…'์ด๋ผ๊ณ ๋„ ๋ถˆ๋Ÿฌ์š” ๐Ÿ”ฅ", emoji: "๐ŸŽ‰", energy: 9 }, { label: "๋ฒ„์Šค2", bars: "8๋งˆ๋””", color: "#7F77DD", desc: "๋ฒ„์Šค๊ฐ€ ๋‹ค์‹œ ๋‚˜์™€์š”!\n์กฐ๊ธˆ ๋‹ค๋ฅธ ๋‚ด์šฉ์ด์ง€๋งŒ ๋น„์Šทํ•œ ๋А๋‚Œ์ด์—์š” ๐Ÿ“–", emoji: "๐Ÿ“", energy: 5 }, { label: "์ฝ”๋Ÿฌ์Šค2", bars: "8๋งˆ๋””", color: "#D85A30", desc: "์ฝ”๋Ÿฌ์Šค๊ฐ€ ๋‹ค์‹œ! ๋” ๊ฐ•ํ•˜๊ฒŒ!\n์•…๊ธฐ๋ฅผ ํ•˜๋‚˜ ๋” ์ถ”๊ฐ€ํ•ด์„œ ํ’์„ฑํ•˜๊ฒŒ ํ•ด์š” ๐ŸŽŠ", emoji: "๐ŸŽ‰", energy: 10 }, { label: "์•„์›ƒํŠธ๋กœ", bars: "4๋งˆ๋””", color: "#888", desc: "๊ณก์ด ๋๋‚˜๊ฐ€์š”!\n์†Œ๋ฆฌ๊ฐ€ ์„œ์„œํžˆ ์ž‘์•„์ง€๊ฑฐ๋‚˜ ๊ฐ‘์ž๊ธฐ ๋Š์–ด์š”.\n'ํŽ˜์ด๋“œ์•„์›ƒ'์ด๋ผ๊ณ ๋„ ํ•ด์š” ๐Ÿ‘‹", emoji: "๐ŸŒ…", energy: 2 }, ]; const sel = selSec !== null ? sections[selSec] : null; return (

๋…ธ๋ž˜๋„ ์ด์•ผ๊ธฐ์ฒ˜๋Ÿผ ์ˆœ์„œ๊ฐ€ ์žˆ์–ด์š”!
์‹œ์ž‘ โ†’ ์ค‘๊ฐ„ โ†’ ํด๋ผ์ด๋งฅ์Šค โ†’ ๋ ์ด๋Ÿฐ ํ๋ฆ„์ด์—์š” ๐Ÿ“š

{/* ๊ตฌ์กฐ ๋ฐ” */}
{sections.map((sec, i) => (
setSelSec(selSec === i ? null : i)} style={{ flex: 1, background: selSec === i ? sec.color : `${sec.color}88`, display: "flex", flexDirection: "column", alignItems: "center", justifyContent: "center", borderRight: "1px solid rgba(255,255,255,.2)", transition: "all .2s" }}>
{sec.emoji}
{sec.label}
))}
{/* ์—๋„ˆ์ง€ ๊ทธ๋ž˜ํ”„ */} ์—๋„ˆ์ง€ ({x: 10+i*(540/5.5), y: 70-s.energy*6}))].map((p,i)=>i===0?`M${p.x} ${p.y}`:`L${p.x} ${p.y}`).join(" ")} L${10+(sections.length-1)*(540/5.5)} 70 L10 70 Z`} fill="#185FA520" /> ({ x: 10+i*(540/5.5), y: 70-s.energy*6 })).map((p,i)=>i===0?`M${p.x} ${p.y}`:`L${p.x} ${p.y}`).join(" ")} fill="none" stroke="#185FA5" strokeWidth={2.5} strokeLinecap="round" /> {sections.map((s,i)=>( {s.label} ))} {sel ? (
{sel.emoji} {sel.label} ({sel.bars})
{sel.desc}
) : (
์œ„ ๊ตฌ๊ฐ„์„ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”! โ˜๏ธ
)}
๐Ÿ—๏ธ ์—์ด๋ธ”ํ†ค์—์„œ ๊ตฌ์กฐ ๋งŒ๋“œ๋Š” ๋ฒ•!
์–ด๋ ˆ์ธ์ง€๋จผํŠธ ๋ทฐ์—์„œ ํด๋ฆฝ์„ ๋ณต์‚ฌ(Ctrl+D)ํ•ด์„œ
๊ฐ ์„น์…˜์— ๋ถ™์—ฌ๋„ฃ๊ธฐ ํ•˜๋ฉด ๋ผ์š”!
); } }, { id: 6, emoji: "๐ŸŽš๏ธ", title: "์†Œ๋ฆฌ ๋‹ค๋“ฌ๊ธฐ (๋ฏน์‹ฑ)", color: "#993556", light: "#FBEAF0", dark: "#72243E", render: () => { const [vols, setVols] = useState({ drum: 75, bass: 65, chord: 55, melody: 60 }); const tracks = [ { key: "drum", label: "๐Ÿฅ ๋“œ๋Ÿผ", color: "#7F77DD", desc: "๊ฐ€์žฅ ์ค‘์‹ฌ!" }, { key: "bass", label: "๐ŸŽธ ๋ฒ ์ด์Šค", color: "#1D9E75", desc: "๋“œ๋Ÿผ๋ณด๋‹ค ์‚ด์ง ๋‚ฎ๊ฒŒ" }, { key: "chord", label: "๐ŸŽน ์ฝ”๋“œ", color: "#BA7517", desc: "๋ฐฐ๊ฒฝ ๋А๋‚Œ์œผ๋กœ" }, { key: "melody", label: "๐ŸŽต ๋ฉœ๋กœ๋””", color: "#D85A30", desc: "์ž˜ ๋“ค๋ ค์•ผ ํ•ด์š”" }, ]; const rules = [ { emoji: "๐Ÿ”Š", title: "๋ณผ๋ฅจ ๊ท ํ˜•", body: "๋“œ๋Ÿผ์ด ์ œ์ผ ํฌ๊ณ \n๋ฒ ์ด์Šค โ†’ ๋ฉœ๋กœ๋”” โ†’ ์ฝ”๋“œ ์ˆœ์„œ๋กœ ์กฐ์ ˆํ•ด์š”" }, { emoji: "โœ‚๏ธ", title: "EQ (์ดํ€„๋ผ์ด์ €)", body: "์•…๊ธฐ๋งˆ๋‹ค ์ž๊ธฐ ์ฃผํŒŒ์ˆ˜ ์˜์—ญ์ด ์žˆ์–ด์š”.\n๊ฒน์น˜๋ฉด ๋ญ‰๊ฐœ์ง€๋‹ˆ๊นŒ ์ž˜๋ผ์ค˜์š”" }, { emoji: "๐Ÿ›๏ธ", title: "๋ฆฌ๋ฒ„๋ธŒ", body: "์†Œ๋ฆฌ์— ๊ณต๊ฐ„๊ฐ์„ ์ฃผ๋Š” ๊ฑฐ์˜ˆ์š”.\n์ƒค์›Œ์‹ค์—์„œ ๋…ธ๋ž˜ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์šธ๋ฆผ์„ ์ถ”๊ฐ€ํ•ด์š”" }, { emoji: "โšก", title: "์ปดํ”„๋ ˆ์„œ", body: "๋„ˆ๋ฌด ํฐ ์†Œ๋ฆฌ๋ฅผ ์ž๋™์œผ๋กœ ๋ˆŒ๋Ÿฌ์ค˜์š”.\n์Œ๋Ÿ‰์ด ๊ณ ๋ฅด๊ฒŒ ์œ ์ง€๋ผ์š”" }, ]; return (

๋ฏน์‹ฑ์€ ๋ชจ๋“  ์†Œ๋ฆฌ์˜ ๋ณผ๋ฅจ๊ณผ ์ƒ‰๊น”์„ ์กฐ์ ˆํ•˜๋Š” ๊ฑฐ์˜ˆ์š”!
์š”๋ฆฌ๋กœ ์น˜๋ฉด ๊ฐ„์„ ๋งž์ถ”๋Š” ๊ฒƒ ๊ฐ™์•„์š” ๐Ÿณ

{/* ๊ฐ€์ƒ ๋ฏน์„œ */}
๐ŸŽš๏ธ ์Šฌ๋ผ์ด๋”๋ฅผ ์›€์ง์—ฌ์„œ ๋ณผ๋ฅจ์„ ์กฐ์ ˆํ•ด๋ด์š”!
{tracks.map(t => (
{t.label}
setVols(v => ({ ...v, [t.key]: +e.target.value }))} style={{ flex: 1, accentColor: t.color }} />
{vols[t.key]}
))}
{rules.map((r, i) => (
{r.emoji}
{r.title}
{r.body}
))}
โš ๏ธ ๋งˆ์Šคํ„ฐ ๋ณผ๋ฅจ ์กฐ์‹ฌ!
๋งˆ์Šคํ„ฐ ํŠธ๋ž™ ๋ฏธํ„ฐ๊ฐ€ ๋นจ๊ฐ„์ƒ‰ = ์†Œ๋ฆฌ ๊นจ์ง!
๋นจ๊ฐ„๋ถˆ ์ผœ์ง€๋ฉด ๊ฐ ํŠธ๋ž™ ๋ณผ๋ฅจ์„ ๋‚ฎ์ถฐ์•ผ ํ•ด์š” ๐Ÿ”ด
); } }, { id: 7, emoji: "โŒจ๏ธ", title: "๊ผญ ์™ธ์šธ ๋‹จ์ถ•ํ‚ค", color: "#1D9E75", light: "#E1F5EE", dark: "#085041", render: () => { const [quiz, setQuiz] = useState(false); const [qIdx, setQIdx] = useState(0); const [sel, setSel] = useState(null); const shortcuts = [ { key: "Space", desc: "โ–ถ ์žฌ์ƒ / โ–  ์ •์ง€", emoji: "โ–ถ๏ธ" }, { key: "Tab", desc: "์„ธ์…˜ ๋ทฐ โ†” ์–ด๋ ˆ์ธ์ง€ ๋ทฐ ์ „ํ™˜", emoji: "๐Ÿ”„" }, { key: "Ctrl + Z", desc: "์‹ค์ˆ˜ ๋˜๋Œ๋ฆฌ๊ธฐ (์ทจ์†Œ)", emoji: "โ†ฉ๏ธ" }, { key: "Ctrl + S", desc: "์ €์žฅํ•˜๊ธฐ", emoji: "๐Ÿ’พ" }, { key: "Ctrl + D", desc: "ํด๋ฆฝ ๋ณต์ œ", emoji: "๐Ÿ“‹" }, { key: "Ctrl + A", desc: "์ „์ฒด ์„ ํƒ", emoji: "โ˜‘๏ธ" }, { key: "Ctrl + U", desc: "ํ€€ํƒ€์ด์ฆˆ (๋ฐ•์ž ์ •๋ ฌ)", emoji: "๐Ÿ“" }, { key: "Ctrl + ,", desc: "์„ค์ •(Preferences) ์—ด๊ธฐ", emoji: "โš™๏ธ" }, { key: "M", desc: "์ปดํ“จํ„ฐ ํ‚ค๋ณด๋“œ๋กœ ํ”ผ์•„๋…ธ ์—ฐ์ฃผ", emoji: "๐ŸŽน" }, { key: "Ctrl + Shift + R", desc: "์™„์„ฑ ํŒŒ์ผ ๋‚ด๋ณด๋‚ด๊ธฐ(Export)", emoji: "๐Ÿ“ค" }, ]; const quizItems = [ { q: "์‹ค์ˆ˜ํ–ˆ์„ ๋•Œ ๋˜๋Œ๋ฆฌ๋ ค๋ฉด?", a: "Ctrl + Z", opts: ["Ctrl + Z", "Ctrl + S", "Tab", "Space"] }, { q: "์ €์žฅํ•  ๋•Œ ์“ฐ๋Š” ๋‹จ์ถ•ํ‚ค๋Š”?", a: "Ctrl + S", opts: ["Ctrl + D", "Ctrl + S", "Ctrl + A", "Ctrl + Z"] }, { q: "์žฌ์ƒ/์ •์ง€ ๋‹จ์ถ•ํ‚ค๋Š”?", a: "Space", opts: ["Tab", "M", "Space", "Ctrl + D"] }, { q: "๋‘ ๋ทฐ๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๋‹จ์ถ•ํ‚ค๋Š”?", a: "Tab", opts: ["Space", "Tab", "Ctrl + Z", "M"] }, { q: "ํŒŒ์ผ์„ ๋‚ด๋ณด๋‚ผ ๋•Œ๋Š”?", a: "Ctrl + Shift + R", opts: ["Ctrl + S", "Ctrl + D", "Ctrl + Shift + R", "Ctrl + A"] }, ]; const q = quizItems[qIdx]; const handleAns = (ans) => { setSel(ans); setTimeout(() => { if (qIdx < quizItems.length - 1) { setQIdx(i => i + 1); setSel(null); } else { setQuiz(false); setQIdx(0); setSel(null); } }, 1200); }; return (

์ด ๋‹จ์ถ•ํ‚ค๋“ค๋งŒ ์™ธ์›Œ๋„ ์ž‘์—… ์†๋„๊ฐ€ 2๋ฐฐ ๋นจ๋ผ์ ธ์š”!
์ฒ˜์Œ์—” ์™ธ์šฐ๊ธฐ ์–ด๋ ต์ง€๋งŒ ์“ฐ๋‹ค ๋ณด๋ฉด ์†์ด ๊ธฐ์–ตํ•ด์š” ๐Ÿคš

{!quiz ? ( <>
{shortcuts.map((s, i) => (
{s.emoji}
{s.key.split(" + ").map((k, j) => ( {j > 0 && +} {k} ))}
{s.desc}
))}
) : (
๋ฌธ์ œ {qIdx + 1} / {quizItems.length}
{q.q}
{q.opts.map((opt, i) => { const isAns = opt === q.a; const isSel = sel === opt; let bg = "#fff", border = "#ddd", color = "#333"; if (sel !== null) { if (isAns) { bg = "#E1F5EE"; border = "#1D9E75"; color = "#085041"; } else if (isSel) { bg = "#FCEBEB"; border = "#E24B4A"; color = "#791F1F"; } else { bg = "#f0f0f0"; color = "#aaa"; } } return ( ); })}
)}
); } }, { id: 8, emoji: "๐Ÿš€", title: "์ฒซ ๊ณก ๋งŒ๋“ค๊ธฐ ์ˆœ์„œ", color: "#D85A30", light: "#FAECE7", dark: "#712B13", render: () => { const [done, setDone] = useState(Array(12).fill(false)); const toggle = i => setDone(d => d.map((v, idx) => idx === i ? !v : v)); const doneCount = done.filter(Boolean).length; const steps = [ { group: "๐Ÿ”ง ์ค€๋น„", color: "#7F77DD", items: ["์—์ด๋ธ”ํ†ค ์ผœ๊ธฐ", "Preferences โ†’ ASIO ๋“œ๋ผ์ด๋ฒ„ ์„ค์ •", "์ƒˆ ํ”„๋กœ์ ํŠธ ๋งŒ๋“ค๊ณ  ์ €์žฅ (Ctrl+S)"] }, { group: "๐Ÿฅ ๋“œ๋Ÿผ", color: "#1D9E75", items: ["MIDI ํŠธ๋ž™ ์ถ”๊ฐ€ (Ctrl+Shift+T)", "ํŒŒ์ผ ์ฐฝ โ†’ Drums โ†’ ํ‚ท ๋“œ๋ž˜๊ทธ", "8๋งˆ๋”” ํด๋ฆฝ ๋งŒ๋“ค๊ณ  ํ‚ฅยท์Šค๋„ค์–ดยทํ•˜์ดํ–‡ ์ฐ๊ธฐ"] }, { group: "๐ŸŽต ์Œ์•…", color: "#BA7517", items: ["์ฝ”๋“œ ํŠธ๋ž™ ์ถ”๊ฐ€ โ†’ ์•…๊ธฐ ๋กœ๋“œ", "ํ”ผ์•„๋…ธ ๋กค โ†’ Scale ON โ†’ ์ฝ”๋“œ ์ž…๋ ฅ", "๋ฉœ๋กœ๋”” ํŠธ๋ž™ ์ถ”๊ฐ€ โ†’ ๋ฉœ๋กœ๋”” ์ฐ๊ธฐ"] }, { group: "๐Ÿ—๏ธ ์™„์„ฑ", color: "#D85A30", items: ["์–ด๋ ˆ์ธ์ง€๋จผํŠธ ๋ทฐ์—์„œ ๊ตฌ์กฐ ๋ฐฐ์น˜ (Tab)", "์˜คํ† ๋ฉ”์ด์…˜์œผ๋กœ ๋ณผ๋ฅจ ์กฐ์ ˆ (Aํ‚ค)", "Ctrl+Shift+R โ†’ WAV๋กœ Export!"] }, ]; let idx = 0; return (
๐ŸŽผ
์ฒซ ๊ณก ์™„์„ฑ ๋„์ „!
์•„๋ž˜ ๋‹จ๊ณ„๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋ฉด ๊ณก์ด ์™„์„ฑ๋ผ์š”!
{/* ์ง„ํ–‰๋ฅ  */}
{doneCount}/12
{steps.map((grp, gi) => (
{grp.group}
{grp.items.map((item, ii) => { const i = idx++; return (
toggle(i)} style={{ display: "flex", alignItems: "flex-start", gap: 10, padding: "11px 13px", background: done[i] ? "#E1F5EE" : "#fff", borderRadius: 11, marginBottom: 6, border: `1.5px solid ${done[i] ? "#1D9E75" : "#eee"}`, cursor: "pointer", transition: "all .2s" }}>
{done[i] ? "โœ“" : i + 1}
{item}
); })}
))} {doneCount === 12 && (
๐ŸŽ‰
์ฒซ ๊ณก ์™„์„ฑ! ๋Œ€๋‹จํ•ด์š”!
์ด์ œ ์ง„์งœ ์Œ์•… ํ”„๋กœ๋“€์„œ๊ฐ€ ๋์–ด์š”!
๊ณ„์† ๋งŒ๋“ค๋‹ค ๋ณด๋ฉด ์‹ค๋ ฅ์ด ์‘ฅ์‘ฅ ๋Š˜์–ด์š” ๐Ÿš€
)}
); } }, ]; export default function App() { const [active, setActive] = useState(0); const ch = chapters[active]; return (
{/* ํ—ค๋” */}
์ดˆ๋“ฑํ•™์ƒ๋„ OK! ์—์ด๋ธ”ํ†ค ๊ธฐ์ดˆ
๐ŸŽผ ์Œ์•… ๋งŒ๋“ค๊ธฐ ์ฒซ๊ฑธ์Œ
{active + 1}/{chapters.length} โ€” {ch.title}
{/* ํƒญ */}
{chapters.map((c, i) => ( ))}
{/* ์นด๋“œ */}
{ch.emoji}
{ch.title}
{ch.subtitle}
{/* ์ด์ „/๋‹ค์Œ */}
{active > 0 && ( )} {active < chapters.length - 1 && ( )}
); }