tools:rhythmustrainer-einfach
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt.
| Nächste Überarbeitung | Vorherige Überarbeitung | ||
| tools:rhythmustrainer-einfach [10/08/2025 15:58] – angelegt Eric Weber | tools:rhythmustrainer-einfach [12/08/2025 20:59] (aktuell) – Eric Weber | ||
|---|---|---|---|
| Zeile 6: | Zeile 6: | ||
| < | < | ||
| < | < | ||
| - | | + | |
| font-family: | font-family: | ||
| max-width: 800px; | max-width: 800px; | ||
| margin: 0 auto; | margin: 0 auto; | ||
| padding: 20px; | padding: 20px; | ||
| - | background: linear-gradient(135deg, | ||
| - | min-height: 100vh; | ||
| color: #333; | color: #333; | ||
| + | box-sizing: border-box; | ||
| } | } | ||
| - | .container | + | .rhythm-trainer * { |
| - | | + | |
| - | | + | |
| - | padding: 30px; | + | |
| - | | + | |
| - | backdrop-filter: | + | |
| } | } | ||
| - | h1 { | + | |
| text-align: center; | text-align: center; | ||
| color: #4a5568; | color: #4a5568; | ||
| - | margin-bottom: 30px; | + | margin: |
| font-size: 2.5em; | font-size: 2.5em; | ||
| background: linear-gradient(45deg, | background: linear-gradient(45deg, | ||
| Zeile 35: | Zeile 30: | ||
| } | } | ||
| - | .controls { | + | |
| display: flex; | display: flex; | ||
| gap: 15px; | gap: 15px; | ||
| Zeile 43: | Zeile 38: | ||
| } | } | ||
| - | button { | + | |
| padding: 12px 24px; | padding: 12px 24px; | ||
| font-size: 16px; | font-size: 16px; | ||
| Zeile 55: | Zeile 50: | ||
| } | } | ||
| - | .primary-btn { | + | |
| background: linear-gradient(45deg, | background: linear-gradient(45deg, | ||
| color: white; | color: white; | ||
| Zeile 61: | Zeile 56: | ||
| } | } | ||
| - | .primary-btn: | + | |
| transform: translateY(-2px); | transform: translateY(-2px); | ||
| box-shadow: 0 8px 25px rgba(102, 126, 234, 0.6); | box-shadow: 0 8px 25px rgba(102, 126, 234, 0.6); | ||
| } | } | ||
| - | .secondary-btn { | + | |
| background: linear-gradient(45deg, | background: linear-gradient(45deg, | ||
| color: white; | color: white; | ||
| Zeile 72: | Zeile 67: | ||
| } | } | ||
| - | .secondary-btn: | + | |
| transform: translateY(-2px); | transform: translateY(-2px); | ||
| box-shadow: 0 8px 25px rgba(72, 187, 120, 0.6); | box-shadow: 0 8px 25px rgba(72, 187, 120, 0.6); | ||
| } | } | ||
| - | .show-btn { | + | |
| background: linear-gradient(45deg, | background: linear-gradient(45deg, | ||
| color: white; | color: white; | ||
| Zeile 83: | Zeile 78: | ||
| } | } | ||
| - | .show-btn: | + | |
| transform: translateY(-2px); | transform: translateY(-2px); | ||
| box-shadow: 0 8px 25px rgba(237, 137, 54, 0.6); | box-shadow: 0 8px 25px rgba(237, 137, 54, 0.6); | ||
| } | } | ||
| - | button: | + | |
| opacity: 0.5; | opacity: 0.5; | ||
| cursor: not-allowed; | cursor: not-allowed; | ||
| Zeile 94: | Zeile 89: | ||
| } | } | ||
| - | .rhythm-display { | + | |
| background: #f7fafc; | background: #f7fafc; | ||
| border: 3px solid #e2e8f0; | border: 3px solid #e2e8f0; | ||
| Zeile 109: | Zeile 104: | ||
| } | } | ||
| - | .rhythm-display:: | + | |
| content: ''; | content: ''; | ||
| position: absolute; | position: absolute; | ||
| Zeile 120: | Zeile 115: | ||
| } | } | ||
| - | .rhythm-display.playing:: | + | |
| left: 100%; | left: 100%; | ||
| } | } | ||
| - | .rhythm-notation { | + | |
| font-size: 3em; | font-size: 3em; | ||
| font-family: | font-family: | ||
| Zeile 133: | Zeile 128: | ||
| } | } | ||
| - | .beat-indicator { | + | |
| display: flex; | display: flex; | ||
| justify-content: | justify-content: | ||
| Zeile 140: | Zeile 135: | ||
| } | } | ||
| - | .beat { | + | |
| width: 60px; | width: 60px; | ||
| height: 60px; | height: 60px; | ||
| Zeile 155: | Zeile 150: | ||
| } | } | ||
| - | .beat.active { | + | |
| background: linear-gradient(45deg, | background: linear-gradient(45deg, | ||
| color: white; | color: white; | ||
| Zeile 162: | Zeile 157: | ||
| } | } | ||
| - | .info { | + | |
| background: #ebf8ff; | background: #ebf8ff; | ||
| border-left: | border-left: | ||
| Zeile 172: | Zeile 167: | ||
| } | } | ||
| - | .tempo-control { | + | |
| display: flex; | display: flex; | ||
| align-items: | align-items: | ||
| Zeile 180: | Zeile 175: | ||
| } | } | ||
| - | .tempo-control input { | + | |
| width: 200px; | width: 200px; | ||
| height: 8px; | height: 8px; | ||
| Zeile 188: | Zeile 183: | ||
| } | } | ||
| - | .tempo-display { | + | |
| font-weight: | font-weight: | ||
| font-size: 18px; | font-size: 18px; | ||
| Zeile 195: | Zeile 190: | ||
| } | } | ||
| - | @keyframes pulse { | + | @keyframes |
| 0% { transform: scale(1); } | 0% { transform: scale(1); } | ||
| 50% { transform: scale(1.1); } | 50% { transform: scale(1.1); } | ||
| Zeile 201: | Zeile 196: | ||
| } | } | ||
| - | .playing .rhythm-notation { | + | |
| - | animation: pulse 0.5s ease-in-out; | + | animation: |
| } | } | ||
| </ | </ | ||
| </ | </ | ||
| < | < | ||
| - | <div class=" | + | <div class=" |
| < | < | ||
| + | < | ||
| | | ||
| <div class=" | <div class=" | ||
| Zeile 298: | Zeile 294: | ||
| currentRhythm.push(Math.random() < 0.5 ? 0 : 1); | currentRhythm.push(Math.random() < 0.5 ? 0 : 1); | ||
| } | } | ||
| + | | ||
| + | // Reset solution state | ||
| solutionVisible = false; | solutionVisible = false; | ||
| + | showBtn.textContent = ' | ||
| + | | ||
| playBtn.disabled = false; | playBtn.disabled = false; | ||
| showBtn.disabled = false; | showBtn.disabled = false; | ||
| Zeile 308: | Zeile 308: | ||
| function rhythmToNotation(rhythm) { | function rhythmToNotation(rhythm) { | ||
| const notation = rhythm.map(beat => { | const notation = rhythm.map(beat => { | ||
| - | return beat === 0 ? ' | + | return beat === 0 ? ' |
| }).join(' | }).join(' | ||
| return notation; | return notation; | ||
tools/rhythmustrainer-einfach.1754834323.txt.gz · Zuletzt geändert: von Eric Weber
