Skip to content

Add standalone Infinity Monster Holodeck v3 web app#9

Open
jpbpari-sys wants to merge 1 commit intomainfrom
codex/add-voice-control-feature
Open

Add standalone Infinity Monster Holodeck v3 web app#9
jpbpari-sys wants to merge 1 commit intomainfrom
codex/add-voice-control-feature

Conversation

@jpbpari-sys
Copy link
Copy Markdown
Owner

Motivation

  • Provide a self-contained, browser-playable interface for the Infinity Monster Holodeck v3 so users can run and interact with the generative audio experience without backend changes.
  • Expose client-side controls for voice input, tempo, XY modulation, swarm saving/loading, and export features to enable local composition and session capture.
  • Add basic frequency-analysis utilities to support healing-frequency optimization of active swarms directly in the frontend.

Description

  • Added a new static file infinity_monster_holodeck_v3.html containing full UI and styling for the Holodeck interface.
  • Implemented a browser-side audio engine with AudioContext graph setup, voice input handling, generative sequencer, play() oscillator synth, and XY pad modulation.
  • Implemented orchestration rendering, a swarm snapshot/library system, session recording/exporting (full-session WAV, per-swarm stems), and MIDI export via the included MIDI library.
  • Added healing-frequency helpers: setTargetFrequencies, analyzeSwarmSpectrum, and optimizeSwarmForHealing for per-swarm spectral analysis and parameter adjustment.

Testing

  • Served the new file locally with python3 -m http.server 8000 --bind 0.0.0.0 and verified the page loaded successfully.
  • Rendered the page in a headless browser and captured a screenshot via a Playwright script to validate UI rendering, which completed successfully.
  • Confirmed the new file is present in the working tree via git status --short and the change was committed; no repository code outside the new HTML was modified.

Codex Task

Copy link
Copy Markdown

@chatgpt-codex-connector chatgpt-codex-connector bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 0b96bdae9c

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

let sessionRecorder, audioChunks=[], isRecording=false;
function toggleSessionRecording(){
if(!isRecording){
const dest=ctx.createMediaStreamDestination();
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Initialize audio context before starting session recording

Clicking Start/Stop Session Recording before INITIALIZE SYSTEM throws because toggleSessionRecording() unconditionally calls ctx.createMediaStreamDestination() while ctx is still undefined, so the recording control fails for first-time users who press record first. Add the same kind of ctx guard/auto-init used in startVoiceControl() before creating the recorder graph.

Useful? React with 👍 / 👎.

function saveSwarm(swarm){
const snapshot={
id:crypto.randomUUID(),
sequence:swarm.sequence?.map(ev=>({...ev.sample}))||[],
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Keep saved sequence events in same shape as runtime events

saveSwarm() stores each sequence item as ({...ev.sample}), which strips the outer event object, but later consumers like exportSessionMIDI() read evt.sample?.midiNote; after saving and reloading a swarm, that field is missing and MIDI export falls back to note 60 for every event. Preserve the original event schema when snapshotting (or update all readers to the flattened schema).

Useful? React with 👍 / 👎.

play(note,0.2);
if(Math.random()<0.1) rootCenter+=(Math.random()>0.5?1:-1);
filter.frequency.setTargetAtTime(300+(morph*5000), ctx.currentTime, 0.1);
},60000/tempo/2);
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Recompute sequencer interval when tempo slider changes

The sequencer delay is fixed when setInterval is created, so updating tempo inside the callback does not change playback speed after initialization; moving the slider changes the variable but not the timer period. Recreate the interval on tempo changes (or switch to a recursive setTimeout that reads current BPM each step) so the BPM control actually affects timing.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant