Audio Device Input #342

Closed
opened 2026-10-06 20:08:48 +02:00 by admin · 2 comments

Ich hätte nun gerne die Möglichkeit direkt Sound aufzunehmen. Dazu kommt im Browser normalerweise eine "Allow" message die man bestätigen muss, das würde passen.

  1. Es soll einen Record-Button geben im Song Tab
  2. Klick man darauf, startet ganz normal der Play Mode und gleichzeitig das Recording an der Stelle vom Timeline Cursor
  3. Stoppt man wieder, dann wird das Recording hochgeladen und als Sound-Asset abgelegt und genau an der Stelle im Song eingefügt wo man recordet hat

Alles was noch abgeklärt werden muss, unbedingt rückfragen

Ich hätte nun gerne die Möglichkeit direkt Sound aufzunehmen. Dazu kommt im Browser normalerweise eine "Allow" message die man bestätigen muss, das würde passen. 1. Es soll einen Record-Button geben im Song Tab 2. Klick man darauf, startet ganz normal der Play Mode und gleichzeitig das Recording an der Stelle vom Timeline Cursor 3. Stoppt man wieder, dann wird das Recording hochgeladen und als Sound-Asset abgelegt und genau an der Stelle im Song eingefügt wo man recordet hat Alles was noch abgeklärt werden muss, unbedingt rückfragen
admin added this to the Development project 2026-10-06 20:08:48 +02:00
admin moved this to Next in Development on 2026-10-06 20:08:54 +02:00
Owner

Entscheidungen (2026-10-06)

Alle Rückfragen wie vorgeschlagen beantwortet:

  1. Aufnahme: Ein eigenes Worklet nimmt die rohen Samples im selben AudioContext auf, in dem der Song spielt. Gespeichert wird WAV (mono, 16 Bit, Rate des Audiogeräts).
  2. Länge: Grenze ist die Größe eines Sounds. Die wurde dafür angehoben: nginx client_max_body_size 256m, PHP upload_max_filesize/post_max_size 256M, memory_limit 512M, API MAX_SOUND_BYTES 256 MB. Das sind etwa 46 min bei 48 kHz. Kurz davor stoppt die Aufnahme von selbst. Ein Upload in Stücken ist damit nicht nötig.
  3. Mono, immer.
  4. Spur: neue Spur „Recording“ direkt unter der zuletzt angeklickten, sonst ganz unten.
  5. Loop: wird beim Aufnehmen nicht beachtet, der Song läuft einmal durch und danach weiter bis Stop.
  6. Kein Einzählen, kein Metronom. Ein Metronom bekommt bei Bedarf ein eigenes Issue.
  7. Latenz: Ausgabe- plus Eingangs-Latenz, soweit der Browser sie meldet, wird abgezogen. Echo-Unterdrückung, Rauschfilter und automatische Lautstärke sind aus. Der Rest lässt sich mit Alt+Ziehen korrigieren.
  8. Eingang: Dropdown neben Record, die Wahl merkt sich der Browser.
  9. Kein Monitoring.
  10. Anzeige: rotes Item, das mitwächst, mit live gezeichneter Wellenform, dazu ein Pegel im Header.
  11. Name: „Songname – Take 1“, 2, 3 …. Esc verwirft die Aufnahme.
  12. Upload scheitert: Dialog mit Retry, Download WAV und Discard.

Sound, Spur und Item sind ein Undo-Schritt. Wie bei hochgeladenen Sounds üblich bleibt die Datei auf dem Server.

## Entscheidungen (2026-10-06) Alle Rückfragen wie vorgeschlagen beantwortet: 1. **Aufnahme:** Ein eigenes Worklet nimmt die rohen Samples im selben AudioContext auf, in dem der Song spielt. Gespeichert wird **WAV** (mono, 16 Bit, Rate des Audiogeräts). 2. **Länge:** Grenze ist die Größe eines Sounds. Die wurde dafür angehoben: nginx `client_max_body_size 256m`, PHP `upload_max_filesize`/`post_max_size` 256M, `memory_limit` 512M, API `MAX_SOUND_BYTES` 256 MB. Das sind etwa 46 min bei 48 kHz. Kurz davor stoppt die Aufnahme von selbst. Ein Upload in Stücken ist damit nicht nötig. 3. **Mono**, immer. 4. **Spur:** neue Spur „Recording“ direkt unter der zuletzt angeklickten, sonst ganz unten. 5. **Loop:** wird beim Aufnehmen nicht beachtet, der Song läuft einmal durch und danach weiter bis Stop. 6. **Kein Einzählen, kein Metronom.** Ein Metronom bekommt bei Bedarf ein eigenes Issue. 7. **Latenz:** Ausgabe- plus Eingangs-Latenz, soweit der Browser sie meldet, wird abgezogen. Echo-Unterdrückung, Rauschfilter und automatische Lautstärke sind aus. Der Rest lässt sich mit Alt+Ziehen korrigieren. 8. **Eingang:** Dropdown neben *Record*, die Wahl merkt sich der Browser. 9. **Kein Monitoring.** 10. **Anzeige:** rotes Item, das mitwächst, mit live gezeichneter Wellenform, dazu ein Pegel im Header. 11. **Name:** „*Songname* – Take 1“, 2, 3 …. **Esc** verwirft die Aufnahme. 12. **Upload scheitert:** Dialog mit *Retry*, *Download WAV* und *Discard*. Sound, Spur und Item sind **ein** Undo-Schritt. Wie bei hochgeladenen Sounds üblich bleibt die Datei auf dem Server.
Owner

Erledigt mit 2fdf97f „Record a take from the microphone in the Song tab (#342)“, Wiki 3def7ea (Songs → Recording, Development).

Umgesetzt wie oben entschieden (alles a):

  • Record im Header des Song-Tabs, daneben Dropdown für den Eingang (Default input oder ein Gerät, gemerkt in localStorage) und ein Pegel.
  • Ein AudioWorklet nimmt die Samples im selben AudioContext auf, in dem der Song spielt. Die Aufnahme wird dort abgeschnitten, wo der Song zu hören war; Ausgabe- und Eingangs-Latenz werden abgezogen, soweit der Browser sie meldet. Echo-Unterdrückung, Rauschfilter und Auto-Gain sind aus, kein Monitoring.
  • Der Loop gilt beim Aufnehmen nicht. Während der Aufnahme wächst ein rotes Item mit Wellenform auf einer neuen Spur Recording unter der zuletzt angeklickten Spur.
  • Stop, Play oder Leertaste behalten das Take: WAV mono 16 Bit, Name „Song – Take 1“, 2, …. Sound, Spur und Item sind ein Undo-Schritt. Esc verwirft, es wird nichts hochgeladen.
  • Grenze 256 MB (≈ 46 min mono, 48 kHz), dann stoppt die Aufnahme von selbst. Ein gescheiterter Upload bietet Retry, Download WAV und Discard.
  • Dafür angehoben (außerhalb des Repos): nginx client_max_body_size 256m, PHP upload_max_filesize/post_max_size 256M, memory_limit 512M. Im Repo MAX_BODY_BYTES und MAX_SOUND_BYTES auf 256 MB. Gemessen: 250 MB kommen vollständig an, Speicher-Spitze 384 MB.

Tests: Unit take.test.ts (7 neu), e2e 65 mit Chromes Fake-Mikrofon (31 Checks, +4), Gate grün (3923 Tests).

Nicht geprüft:

  • Wie genau der Latenzausgleich mit echtem Mikrofon und Lautsprecher sitzt.
  • Der Dialog bei gescheitertem Upload, die Wahl eines bestimmten Eingangs und das automatische Stoppen bei 256 MB.
  • Jeder e2e-Lauf legt ein Take von ≈ 1,5 s im Sound-Store ab (in CI frisch, auf stein2/atx sammelt es sich).

Ein Metronom/Einzählen war bewusst nicht dabei (Frage 6).

Erledigt mit 2fdf97f „Record a take from the microphone in the Song tab (#342)“, Wiki 3def7ea (*Songs* → *Recording*, *Development*). **Umgesetzt wie oben entschieden (alles a):** - **Record** im Header des Song-Tabs, daneben Dropdown für den Eingang (*Default input* oder ein Gerät, gemerkt in localStorage) und ein Pegel. - Ein AudioWorklet nimmt die Samples im selben AudioContext auf, in dem der Song spielt. Die Aufnahme wird dort abgeschnitten, wo der Song zu hören war; Ausgabe- und Eingangs-Latenz werden abgezogen, soweit der Browser sie meldet. Echo-Unterdrückung, Rauschfilter und Auto-Gain sind aus, kein Monitoring. - Der Loop gilt beim Aufnehmen nicht. Während der Aufnahme wächst ein rotes Item mit Wellenform auf einer neuen Spur *Recording* unter der zuletzt angeklickten Spur. - **Stop, Play oder Leertaste** behalten das Take: WAV mono 16 Bit, Name „*Song* – Take 1“, 2, …. Sound, Spur und Item sind **ein** Undo-Schritt. **Esc** verwirft, es wird nichts hochgeladen. - Grenze 256 MB (≈ 46 min mono, 48 kHz), dann stoppt die Aufnahme von selbst. Ein gescheiterter Upload bietet *Retry*, *Download WAV* und *Discard*. - Dafür angehoben (außerhalb des Repos): nginx `client_max_body_size 256m`, PHP `upload_max_filesize`/`post_max_size` 256M, `memory_limit` 512M. Im Repo `MAX_BODY_BYTES` und `MAX_SOUND_BYTES` auf 256 MB. Gemessen: 250 MB kommen vollständig an, Speicher-Spitze 384 MB. **Tests:** Unit `take.test.ts` (7 neu), e2e 65 mit Chromes Fake-Mikrofon (31 Checks, +4), Gate grün (3923 Tests). **Nicht geprüft:** - Wie genau der Latenzausgleich mit echtem Mikrofon und Lautsprecher sitzt. - Der Dialog bei gescheitertem Upload, die Wahl eines bestimmten Eingangs und das automatische Stoppen bei 256 MB. - Jeder e2e-Lauf legt ein Take von ≈ 1,5 s im Sound-Store ab (in CI frisch, auf stein2/atx sammelt es sich). Ein Metronom/Einzählen war bewusst nicht dabei (Frage 6).
admin moved this to Done in Development on 2026-10-06 21:48:07 +02:00
Sign in to join this conversation.
2 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: meleki/feuerwerk#342