fogón

← Whole house3D assetfogon/parlante

Parlante

by fogonCC017467 blocks
ParlanteDrag to turn it
// «Parlante» · gpt-6-sol (medium)
// A tall standing speaker: a black wooden box with two round speaker cones on the front (a small tweeter above a big woofer) with grey rings, and a small glowing power light.

const wood = ["#171513", "#1d1917", "#24201d", "#2b2520"];
const face = "#131416";
const metal = ["#626970", "#899198", "#b6bdc0"];

for (let x = 13; x <= 35; x++) {
  for (let y = 17; y <= 33; y++) {
    for (let z = 2; z <= 40; z++) {
      if ((x === 13 || x === 35) && (z === 2 || z === 40)) continue;
      let c = wood[Math.floor(rand() * wood.length)];
      if (z >= 39) c = rand() < 0.25 ? "#37302a" : "#2d2722";
      if (x === 13) c = "#302923";
      if (x === 35) c = "#171412";
      set(x, y, z, c);
    }
  }
}

// Little feet lift the cabinet just off the floor.
for (const x of [16, 31]) {
  box(x, 21, 0, x + 2, 29, 2, "#171513");
  box(x, 19, 0, x + 2, 21, 1, "#3b3530");
}

// Thick wooden surround and recessed black front panel.
box(14, 16, 3, 34, 18, 38, "#302923");
box(15, 15, 4, 33, 16, 37, face);
box(14, 16, 5, 14, 16, 37, "#44382e");
box(34, 16, 5, 34, 16, 37, "#211b18");
box(15, 16, 38, 33, 18, 39, "#40352b");
box(15, 16, 3, 33, 18, 4, "#211d19");

// Fine walnut grain on the visible sides.
for (let i = 0; i < 45; i++) {
  const z = 5 + Math.floor(rand() * 32);
  const y = 19 + Math.floor(rand() * 13);
  set(13, y, z, rand() < 0.5 ? "#3a3028" : "#211c18");
}

// Front-panel corner fasteners.
for (const x of [16, 32]) {
  for (const z of [6, 36]) {
    set(x, 14, z, "#777a78");
    set(x, 13, z, "#b7b9b3");
  }
}

// Stationary woofer surround and mounting ring.
for (let dx = -11; dx <= 11; dx++) {
  for (let dz = -11; dz <= 11; dz++) {
    const r = Math.hypot(dx, dz);
    const x = 23 + dx, z = 15 + dz;
    if (r <= 10.7 && r >= 8.35) {
      set(x, 14, z, r > 9.8 ? "#222528" : "#525a60");
      if (r >= 9.1 && r <= 10.2)
        set(x, 13, z, dz > 0 ? metal[2] : metal[0]);
      if (r >= 8.4 && r < 9.1) set(x, 12, z, "#25292d");
    }
  }
}
for (const [dx, dz] of [[0, 10], [0, -10], [-10, 0], [10, 0]]) {
  set(23 + dx, 12, 15 + dz, "#35393b");
  set(23 + dx, 11, 15 + dz, "#bec3c1");
}

// Small tweeter: silver bezel, dark cone, and bright center dome.
for (let dx = -5; dx <= 5; dx++) {
  for (let dz = -5; dz <= 5; dz++) {
    const r = Math.hypot(dx, dz);
    const x = 23 + dx, z = 32 + dz;
    if (r <= 5.15) set(x, 14, z, "#34393c");
    if (r >= 3.7 && r <= 5.15)
      set(x, 13, z, dz > 0 ? "#b4bab9" : "#747d80");
    if (r < 3.75) set(x, 13, z, r > 2.5 ? "#262b2e" : "#434a4d");
    if (r < 1.65) set(x, 12, z, dz > 0 ? "#929c9e" : "#677176");
  }
}
set(22, 11, 33, "#cbd1cf");

// Chunky volume knob and a tiny illuminated power button.
box(30, 14, 34, 32, 15, 36, "#555b5c");
box(30, 13, 34, 32, 13, 36, "#a9afad");
set(31, 12, 35, "#4c5254");
set(31, 11, 36, "#e0e0d1");

box(30, 14, 28, 32, 15, 30, "#545e58");
set(31, 13, 29, "#a8e6aa");
set(31, 12, 29, "#d5ffd2");
set(30, 13, 30, "#81bb86");

// The cone alone pumps; the heavy surround stays attached to the cabinet.
part("woofer", [23, 15, 15]);
for (let dx = -8; dx <= 8; dx++) {
  for (let dz = -8; dz <= 8; dz++) {
    const r = Math.hypot(dx, dz);
    if (r > 8.45) continue;
    const x = 23 + dx, z = 15 + dz;
    let y, color;
    if (r > 7.5) {
      y = 13;
      color = "#41484c";
    } else if (r > 5.3) {
      y = 14;
      color = dz > 0 ? "#565e63" : "#394146";
    } else if (r > 3.1) {
      y = 15;
      color = dz > 0 ? "#485156" : "#30383d";
    } else {
      y = 13;
      color = dz > 0 ? "#666e71" : "#424a4e";
    }
    set(x, y + 1, z, "#252a2d");
    set(x, y, z, color);
    if (r > 2.7 && r <= 3.2) set(x, y - 1, z, "#242a2e");
    if (r < 1.3 && dz > 0) set(x, 12, z, "#858d8d");
  }
}
animate("woofer", { type: "bob", axis: "y", speed: 6, amplitude: 1 });
part("body", [24, 24, 0]);