PageSourceSearch

https://www.hamienet.com/assets/CinematicStudio-D4qxmsrt.js

js hamienet.com collected 2026-10-02 05:01:32 UTC 28,677 bytes, 496 lines download raw bytes

1import { r as reactExports, j as jsxRuntimeExports } from "./vendor-react-Bay9Y7Lb.js";
2import { C as Canvas, a as OrbitControls } from "./vendor-react-three-BCww3P1x.js";
3import { g as getInstrumentModelDefaults, S as StageEnvironment, M as Musician3D } from "./Musician3D-2CqS9Wxf.js";
4import { dX as Film, cM as RefreshCw, cd as Save, bi as Sparkles, b_ as Pause, bV as Play } from "./vendor-D0P4XgNj.js";
5import "./vendor-i18n-BC7ZMXWQ.js";
6const GM_CATEGORIES = [
7  { name: "Piano", start: 0, end: 7 },
8  { name: "Chromatic Percussion", start: 8, end: 15 },
9  { name: "Organ", start: 16, end: 23 },
10  { name: "Guitar", start: 24, end: 31 },
11  { name: "Bass", start: 32, end: 39 },
12  { name: "Strings", start: 40, end: 47 },
13  { name: "Ensemble", start: 48, end: 55 },
14  { name: "Brass", start: 56, end: 63 },
15  { name: "Reed (Woodwind)", start: 64, end: 71 },
16  { name: "Pipe (Woodwind)", start: 72, end: 79 },
17  { name: "Synth Lead", start: 80, end: 87 },
18  { name: "Synth Pad", start: 88, end: 95 },
19  { name: "Synth Effects", start: 96, end: 103 },
20  { name: "Ethnic", start: 104, end: 111 },
21  { name: "Percussive", start: 112, end: 119 },
22  { name: "Sound Effects", start: 120, end: 127 }
23];
24function CinematicStudio() {
25  const [selectedProgram, setSelectedProgram] = reactExports.useState(0);
26  const [isPercussion, setIsPercussion] = reactExports.useState(false);
27  const [hairStyle, setHairStyle] = reactExports.useState("piano");
28  const [hairColor, setHairColor] = reactExports.useState("#b7791f");
29  const [skinColor, setSkinColor] = reactExports.useState("#ffdbac");
30  const [outfit, setOutfit] = reactExports.useState("tuxedo");
31  const [accessory, setAccessory] = reactExports.useState("bowtie");
32  const [action, setAction] = reactExports.useState("none");
33  const [isPlaying, setIsPlaying] = reactExports.useState(true);
34  const [instrumentColor, setInstrumentColor] = reactExports.useState("#a27b5c");
35  const [sceneTheme, setSceneTheme] = reactExports.useState("concert_hall");
36  const [spotlights, setSpotlights] = reactExports.useState({
37    center: "#ffddaa",
38    left: "#88ccff",
39    right: "#ff99bb"
40  });
41  const [toastMessage, setToastMessage] = reactExports.useState(null);
42  reactExports.useEffect(() => {
43    var _a;
44    const defaults = getInstrumentModelDefaults(selectedProgram, isPercussion);
45    setHairStyle(defaults.shapeType);
46    setInstrumentColor(defaults.color);
47    try {
48      const savedStr = localStorage.getItem("cinematic_studio_save_data");
49      if (savedStr) {
50        const config = JSON.parse(savedStr);
51        const programKey = String(selectedProgram);
52        if ((_a = config.instruments) == null ? void 0 : _a[programKey]) {
53          const custom = config.instruments[programKey];
54          if (custom.hairStyle) setHairStyle(custom.hairStyle);
55          if (custom.hairColor) setHairColor(custom.hairColor);
56          if (custom.skinColor) setSkinColor(custom.skinColor);
57          if (custom.outfit) setOutfit(custom.outfit);
58          if (custom.accessory) setAccessory(custom.accessory);
59          if (custom.instrumentColor) setInstrumentColor(custom.instrumentColor);
60        }
61        if (config.sceneTheme) setSceneTheme(config.sceneTheme);
62        if (config.spotlights) setSpotlights(config.spotlights);
63      }
64    } catch (e) {
65      console.error("Failed to parse saved config:", e);
66    }
67  }, [selectedProgram, isPercussion]);
68  const handleSave = () => {
69    try {
70      const savedStr = localStorage.getItem("cinematic_studio_save_data");
71      const config = savedStr ? JSON.parse(savedStr) : { instruments: {}, spotlights: {}, sceneTheme: "concert_hall" };
72      const programKey = String(selectedProgram);
73      config.instruments[programKey] = {
74        hairStyle,
75        hairColor,
76        skinColor,
77        outfit,
78        accessory,
79        instrumentColor
80      };
81      config.sceneTheme = sceneTheme;
82      config.spotlights = spotlights;
83      localStorage.setItem("cinematic_studio_save_data", JSON.stringify(config));
84      setToastMessage("Configurations saved successfully!");
85      setTimeout(() => setToastMessage(null), 3e3);
86    } catch (e) {
87      setToastMessage("Failed to save configurations.");
88      setTimeout(() => setToastMessage(null), 3e3);
89    }
90  };
91  const handleReset = () => {
92    const defaults = getInstrumentModelDefaults(selectedProgram, isPercussion);
93    setHairStyle(defaults.shapeType);
94    setInstrumentColor(defaults.color);
95    setHairColor("#b7791f");
96    setSkinColor("#ffdbac");
97    setOutfit("tuxedo");
98    setAccessory("bowtie");
99    setAction("none");
100  };
101  const currentCategory = GM_CATEGORIES.find((cat) => selectedProgram >= cat.start && selectedProgram <= cat.end);
102  return /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-6 p-6 min-h-screen bg-zinc-950 text-white font-sans", children: [
103    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col md:flex-row md:items-center justify-between gap-4 p-5 bg-gradient-to-r from-zinc-900 to-zinc-800 rounded-xl border border-zinc-800 shadow-lg", children: [
104      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-3", children: [
105        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "p-3 bg-amber-500/10 border border-amber-500/30 text-amber-500 rounded-lg", children: /* @__PURE__ */ jsxRuntimeExports.jsx(Film, { size: 26 }) }),
106        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
107          /* @__PURE__ */ jsxRuntimeExports.jsx("h1", { className: "text-2xl font-bold tracking-tight", children: "Cinematic Visualizer Studio" }),
108          /* @__PURE__ */ jsxRuntimeExports.jsx("p", { className: "text-sm text-zinc-400 mt-0.5", children: "Oversee, configure, and sandbox 3D low-poly musician puppets & stage effects" })
109        ] })
110      ] }),
111      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2", children: [
112        /* @__PURE__ */ jsxRuntimeExports.jsxs(
113          "button",
114          {
115            onClick: handleReset,
116            className: "flex items-center gap-2 px-4 py-2 bg-zinc-850 hover:bg-zinc-850 border border-zinc-700 hover:border-zinc-500 rounded-lg text-sm text-zinc-300 hover:text-white transition-all",
117            children: [
118              /* @__PURE__ */ jsxRuntimeExports.jsx(RefreshCw, { size: 16 }),
119              "Reset Program Defaults"
120            ]
121          }
122        ),
123        /* @__PURE__ */ jsxRuntimeExports.jsxs(
124          "button",
125          {
126            onClick: handleSave,
127            className: "flex items-center gap-2 px-5 py-2 bg-amber-600 hover:bg-amber-500 active:bg-amber-700 rounded-lg text-sm font-semibold tracking-wide transition-all shadow-md",
128            children: [
129              /* @__PURE__ */ jsxRuntimeExports.jsx(Save, { size: 16 }),
130              "Save Configuration"
131            ]
132          }
133        )
134      ] })
135    ] }),
136    toastMessage && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "fixed bottom-6 right-6 z-[110] px-5 py-3 bg-zinc-900 border border-amber-500 text-amber-400 rounded-lg shadow-xl text-sm font-semibold flex items-center gap-2 animate-in fade-in slide-in-from-bottom-4 duration-300", children: [
137      /* @__PURE__ */ jsxRuntimeExports.jsx(Sparkles, { size: 16 }),
138      toastMessage
139    ] }),
140    /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-1 xl:grid-cols-12 gap-6", children: [
141      /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "xl:col-span-4 flex flex-col gap-6", children: [
142        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 bg-zinc-900 rounded-xl border border-zinc-850 flex flex-col gap-4", children: [
143          /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-bold text-zinc-200 border-b border-zinc-800 pb-2", children: "Instrument Selection" }),
144          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [
145            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
146              /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Midi Channel Type" }),
147              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex gap-2", children: [
148                /* @__PURE__ */ jsxRuntimeExports.jsx(
149                  "button",
150                  {
151                    onClick: () => {
152                      setIsPercussion(false);
153                      setSelectedProgram(0);
154                    },
155                    className: `flex-1 py-1.5 rounded-lg text-sm border font-medium transition-all ${!isPercussion ? "bg-amber-600/10 border-amber-600 text-amber-500" : "bg-zinc-950 border-zinc-800 hover:border-zinc-700 text-zinc-400"}`,
156                    children: "Melodic Track"
157                  }
158                ),
159                /* @__PURE__ */ jsxRuntimeExports.jsx(
160                  "button",
161                  {
162                    onClick: () => {
163                      setIsPercussion(true);
164                      setSelectedProgram(0);
165                    },
166                    className: `flex-1 py-1.5 rounded-lg text-sm border font-medium transition-all ${isPercussion ? "bg-amber-600/10 border-amber-600 text-amber-500" : "bg-zinc-950 border-zinc-800 hover:border-zinc-700 text-zinc-400"}`,
167                    children: "Percussion Track"
168                  }
169                )
170              ] })
171            ] }),
172            !isPercussion && /* @__PURE__ */ jsxRuntimeExports.jsxs(jsxRuntimeExports.Fragment, { children: [
173              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
174                /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Category Group" }),
175                /* @__PURE__ */ jsxRuntimeExports.jsx(
176                  "select",
177                  {
178                    onChange: (e) => {
179                      const cat = GM_CATEGORIES.find((c) => c.name === e.target.value);
180                      if (cat) setSelectedProgram(cat.start);
181                    },
182                    value: (currentCategory == null ? void 0 : currentCategory.name) || "Piano",
183                    className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none",
184                    children: GM_CATEGORIES.map((cat) => /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: cat.name, children: cat.name }, cat.name))
185                  }
186                )
187              ] }),
188              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
189                /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Instrument Program" }),
190                /* @__PURE__ */ jsxRuntimeExports.jsx(
191                  "select",
192                  {
193                    onChange: (e) => setSelectedProgram(Number(e.target.value)),
194                    value: selectedProgram,
195                    className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none",
196                    children: currentCategory && Array.from({ length: currentCategory.end - currentCategory.start + 1 }, (_, i) => {
197                      const prog = currentCategory.start + i;
198                      return /* @__PURE__ */ jsxRuntimeExports.jsxs("option", { value: prog, children: [
199                        "Program ",
200                        prog,
201                        " (Category ",
202                        currentCategory.name,
203                        ")"
204                      ] }, prog);
205                    })
206                  }
207                )
208              ] })
209            ] }),
210            isPercussion && /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
211              /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Percussion Program Mapping" }),
212              /* @__PURE__ */ jsxRuntimeExports.jsx(
213                "select",
214                {
215                  onChange: (e) => setSelectedProgram(Number(e.target.value)),
216                  value: selectedProgram,
217                  className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none",
218                  children: /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: 0, children: "General Percussion Channel 9 (Drums/Snare/Tom)" })
219                }
220              )
221            ] })
222          ] })
223        ] }),
224        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 bg-zinc-900 rounded-xl border border-zinc-850 flex flex-col gap-4", children: [
225          /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-bold text-zinc-200 border-b border-zinc-800 pb-2", children: "Humanoid Customizer" }),
226          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [
227            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
228              /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Hairstyle Preset" }),
229              /* @__PURE__ */ jsxRuntimeExports.jsxs(
230                "select",
231                {
232                  onChange: (e) => setHairStyle(e.target.value),
233                  value: hairStyle,
234                  className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none",
235                  children: [
236                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "piano", children: "Classical Buns (Piano/Violin style)" }),
237                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "guitar", children: "Punk Spikes (Guitar/Bass/Synth style)" }),
238                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "drums", children: "Baseball Cap (Drummer style)" })
239                  ]
240                }
241              )
242            ] }),
243            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
244              /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Outfit Costume" }),
245              /* @__PURE__ */ jsxRuntimeExports.jsxs(
246                "select",
247                {
248                  onChange: (e) => setOutfit(e.target.value),
249                  value: outfit,
250                  className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none",
251                  children: [
252                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "tuxedo", children: "Classical Tuxedo Suit" }),
253                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "tshirt", children: "Casual Rocker T-Shirt" }),
254                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "robe", children: "Electronic Synth Wizard Robe" })
255                  ]
256                }
257              )
258            ] }),
259            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
260              /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Outfit Accessories" }),
261              /* @__PURE__ */ jsxRuntimeExports.jsxs(
262                "select",
263                {
264                  onChange: (e) => setAccessory(e.target.value),
265                  value: accessory,
266                  className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none",
267                  children: [
268                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "none", children: "None" }),
269                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "sunglasses", children: "Rocker Sunglasses" }),
270                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "bowtie", children: "Tuxedo Bowtie" }),
271                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "both", children: "Both Sunglasses & Bowtie" })
272                  ]
273                }
274              )
275            ] }),
276            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-2 gap-2", children: [
277              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
278                /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Hair Tone" }),
279                /* @__PURE__ */ jsxRuntimeExports.jsx(
280                  "input",
281                  {
282                    type: "color",
283                    value: hairColor,
284                    onChange: (e) => setHairColor(e.target.value),
285                    className: "w-full h-8 bg-transparent cursor-pointer rounded outline-none border border-zinc-800"
286                  }
287                )
288              ] }),
289              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
290                /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Skin Tone" }),
291                /* @__PURE__ */ jsxRuntimeExports.jsx(
292                  "input",
293                  {
294                    type: "color",
295                    value: skinColor,
296                    onChange: (e) => setSkinColor(e.target.value),
297                    className: "w-full h-8 bg-transparent cursor-pointer rounded outline-none border border-zinc-800"
298                  }
299                )
300              ] })
301            ] }),
302            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
303              /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Instrument Body Color" }),
304              /* @__PURE__ */ jsxRuntimeExports.jsx(
305                "input",
306                {
307                  type: "color",
308                  value: instrumentColor,
309                  onChange: (e) => setInstrumentColor(e.target.value),
310                  className: "w-full h-8 bg-transparent cursor-pointer rounded outline-none border border-zinc-800"
311                }
312              )
313            ] })
314          ] })
315        ] }),
316        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "p-5 bg-zinc-900 rounded-xl border border-zinc-850 flex flex-col gap-4", children: [
317          /* @__PURE__ */ jsxRuntimeExports.jsx("h2", { className: "text-base font-bold text-zinc-200 border-b border-zinc-800 pb-2", children: "Stage & Backing Scene" }),
318          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex flex-col gap-3", children: [
319            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
320              /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Acoustic Backdrop Style" }),
321              /* @__PURE__ */ jsxRuntimeExports.jsxs(
322                "select",
323                {
324                  onChange: (e) => setSceneTheme(e.target.value),
325                  value: sceneTheme,
326                  className: "w-full px-3 py-2 bg-zinc-950 border border-zinc-850 hover:border-zinc-700 rounded-lg text-sm text-zinc-300 outline-none",
327                  children: [
328                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "concert_hall", children: "Mahogany Sound Diffuser slats (Classic)" }),
329                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "neon_club", children: "Glowing grid vertical neon bars (Cyberpunk)" }),
330                    /* @__PURE__ */ jsxRuntimeExports.jsx("option", { value: "space_abyss", children: "Floating space diamond crystals (Abyss)" })
331                  ]
332                }
333              )
334            ] }),
335            /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
336              /* @__PURE__ */ jsxRuntimeExports.jsx("label", { className: "block text-xs font-semibold text-zinc-400 mb-1", children: "Spotlight Color Channels" }),
337              /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "grid grid-cols-3 gap-2", children: [
338                /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
339                  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block text-[10px] text-zinc-500 font-semibold mb-0.5", children: "Center" }),
340                  /* @__PURE__ */ jsxRuntimeExports.jsx(
341                    "input",
342                    {
343                      type: "color",
344                      value: spotlights.center,
345                      onChange: (e) => setSpotlights((prev) => ({ ...prev, center: e.target.value })),
346                      className: "w-full h-8 bg-transparent cursor-pointer rounded border border-zinc-800"
347                    }
348                  )
349                ] }),
350                /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
351                  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block text-[10px] text-zinc-500 font-semibold mb-0.5", children: "Left" }),
352                  /* @__PURE__ */ jsxRuntimeExports.jsx(
353                    "input",
354                    {
355                      type: "color",
356                      value: spotlights.left,
357                      onChange: (e) => setSpotlights((prev) => ({ ...prev, left: e.target.value })),
358                      className: "w-full h-8 bg-transparent cursor-pointer rounded border border-zinc-800"
359                    }
360                  )
361                ] }),
362                /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { children: [
363                  /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "block text-[10px] text-zinc-500 font-semibold mb-0.5", children: "Right" }),
364                  /* @__PURE__ */ jsxRuntimeExports.jsx(
365                    "input",
366                    {
367                      type: "color",
368                      value: spotlights.right,
369                      onChange: (e) => setSpotlights((prev) => ({ ...prev, right: e.target.value })),
370                      className: "w-full h-8 bg-transparent cursor-pointer rounded border border-zinc-800"
371                    }
372                  )
373                ] })
374              ] })
375            ] })
376          ] })
377        ] })
378      ] }),
379      /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "xl:col-span-8 flex flex-col gap-6", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative w-full aspect-[16/10] min-h-[480px] bg-zinc-950 border border-zinc-850 rounded-xl overflow-hidden shadow-2xl flex flex-col justify-between", children: [
380        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "absolute inset-0 z-0", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
381          Canvas,
382          {
383            camera: { position: [0, 2.5, 5], fov: 40 },
384            shadows: true,
385            gl: { antialias: true, alpha: false },
386            children: [
387              /* @__PURE__ */ jsxRuntimeExports.jsx("color", { attach: "background", args: [sceneTheme === "space_abyss" ? "#030307" : "#0a0a0f"] }),
388              /* @__PURE__ */ jsxRuntimeExports.jsx("ambientLight", { intensity: sceneTheme === "space_abyss" ? 0.3 : 0.6 }),
389              /* @__PURE__ */ jsxRuntimeExports.jsx(
390                "directionalLight",
391                {
392                  position: [5, 10, 5],
393                  intensity: 1.2,
394                  castShadow: true,
395                  "shadow-mapSize": [1024, 1024]
396                }
397              ),
398              /* @__PURE__ */ jsxRuntimeExports.jsx(
399                StageEnvironment,
400                {
401                  musicianPositions: [],
402                  activeTrackIndices: /* @__PURE__ */ new Set(),
403                  showGrid: true,
404                  density: isPlaying ? 12 : 0
405                }
406              ),
407              /* @__PURE__ */ jsxRuntimeExports.jsx(
408                Musician3D,
409                {
410                  index: 0,
411                  instrument: {
412                    program: selectedProgram,
413                    midiChannel: isPercussion ? 9 : 0
414                  },
415                  position: {
416                    x: 0,
417                    y: 0,
418                    z: 0,
419                    rotationY: 0
420                  },
421                  activeNotes: isPlaying ? [{ i: 0, v: 0.8 }] : [],
422                  soloedIndex: null,
423                  previewOverride: {
424                    hairStyle,
425                    hairColor,
426                    skinColor,
427                    outfit,
428                    accessory,
429                    action
430                  }
431                }
432              ),
433              /* @__PURE__ */ jsxRuntimeExports.jsx(
434                OrbitControls,
435                {
436                  enablePan: true,
437                  enableZoom: true,
438                  maxPolarAngle: Math.PI / 2 - 0.05,
439                  minDistance: 2,
440                  maxDistance: 15
441                }
442              )
443            ]
444          }
445        ) }),
446        /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "relative z-10 p-4 bg-gradient-to-b from-black/80 to-transparent flex items-center justify-between gap-4 pointer-events-none", children: /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-2 px-3 py-1 bg-black/60 border border-zinc-800 rounded-full text-xs font-semibold text-zinc-300", children: [
447          /* @__PURE__ */ jsxRuntimeExports.jsx(Sparkles, { size: 12, className: "text-amber-500" }),
448          "Interactive 3D Sandbox (Left-click & drag to orbit, scroll to zoom)"
449        ] }) }),
450        /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "relative z-10 p-5 bg-gradient-to-t from-black/90 to-transparent flex flex-wrap items-center justify-between gap-4", children: [
451          /* @__PURE__ */ jsxRuntimeExports.jsx("div", { className: "flex items-center gap-2 bg-zinc-900/90 border border-zinc-850 p-1.5 rounded-lg", children: /* @__PURE__ */ jsxRuntimeExports.jsxs(
452            "button",
453            {
454              onClick: () => setIsPlaying(!isPlaying),
455              className: `p-2 rounded-md flex items-center justify-center gap-2 text-xs font-bold transition-all ${isPlaying ? "bg-amber-600 text-white" : "bg-zinc-800 text-zinc-300 hover:text-white"}`,
456              children: [
457                isPlaying ? /* @__PURE__ */ jsxRuntimeExports.jsx(Pause, { size: 14 }) : /* @__PURE__ */ jsxRuntimeExports.jsx(Play, { size: 14 }),
458                isPlaying ? "Simulate Notes Playing" : "Idle resting pose"
459              ]
460            }
461          ) }),
462          /* @__PURE__ */ jsxRuntimeExports.jsxs("div", { className: "flex items-center gap-1.5 bg-zinc-900/90 border border-zinc-850 p-1.5 rounded-lg", children: [
463            /* @__PURE__ */ jsxRuntimeExports.jsx("span", { className: "text-[10px] font-bold text-zinc-400 uppercase tracking-wider px-2", children: "Gestures:" }),
464            /* @__PURE__ */ jsxRuntimeExports.jsx(
465              "button",
466              {
467                onClick: () => setAction(action === "waving" ? "none" : "waving"),
468                className: `px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${action === "waving" ? "bg-amber-600 text-white" : "bg-zinc-800 text-zinc-400 hover:text-white"}`,
469                children: "Wave Arm"
470              }
471            ),
472            /* @__PURE__ */ jsxRuntimeExports.jsx(
473              "button",
474              {
475                onClick: () => setAction(action === "winking" ? "none" : "winking"),
476                className: `px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${action === "winking" ? "bg-amber-600 text-white" : "bg-zinc-800 text-zinc-400 hover:text-white"}`,
477                children: "Wink Eye"
478              }
479            ),
480            /* @__PURE__ */ jsxRuntimeExports.jsx(
481              "button",
482              {
483                onClick: () => setAction(action === "air_guitar" ? "none" : "air_guitar"),
484                className: `px-3 py-1.5 rounded-md text-xs font-semibold transition-all ${action === "air_guitar" ? "bg-amber-600 text-white" : "bg-zinc-800 text-zinc-400 hover:text-white"}`,
485                children: "Air Guitar Stance"
486              }
487            )
488          ] })
489        ] })
490      ] }) })
491    ] })
492  ] });
493}
494export {
495  CinematicStudio as default
496};

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.