---
layout: activity
title: "El Metrónomo de DJ"
image: src/22.1-dj-metronome/22.1-metronomo-de-dj.svg

video: src/videos/22.1_dj_metronome.mp4
video_title: "¿Qué haremos?"
description: "Combina sensores, matemáticas y una lógica de tiempo avanzada para construir una herramienta de DJ profesional: un metrónomo cuyo tempo controlas con la inclinación."
lang: es
permalink: /es/actividades/el-metronomo-de-dj/
ref: activity_dj_metronome

# ACTIVITY INFO
level: 3
computational_topics:
  - "Bucles"
  - "Variables y Datos"
  - "Condicionales y Lógica"
  - "Matemáticas y Lógica"
general_topics:
  - "Arte y Música"
  - "Ciencia y Tecnología"

tags: [Síntesis Avanzada, Lógica de Tiempo, Metrónomo, BPM, Mapeo, Cálculo Matemático, Sensores]

introduction: |
  Has dominado las piezas, ahora es el momento de construir una máquina de precisión. En este proyecto avanzado de síntesis, irás más allá de las pausas simples para implementar una **lógica de tiempo profesional**. Combinarás el mapeo de sensores con cálculos matemáticos para crear una herramienta real y útil: un metrónomo para DJ cuyo tempo puedes controlar con el movimiento de tu mano. ¡Prepárate para sentir el ritmo y programar como un experto!

teacher: |
  ### **Cursos**
  * Grados 9-12

  ### **Materiales**
  * Celular, tableta o computadora
  * Conexión a Internet

  ### **Descripción**
  Este es un proyecto de síntesis avanzado que desafía a los estudiantes a integrar múltiples conceptos de alto nivel: mapeo de sensores, aplicación de fórmulas matemáticas, gestión de estado compleja (rastrear el tiempo del último evento) y, lo más importante, la implementación de un temporizador "no bloqueante" utilizando variables y condicionales.

  ### **Objetivos Educativos**
  * Aplicar fórmulas matemáticas para convertir un tipo de dato en otro (BPM a milisegundos).
  * Implementar una lógica de temporización no bloqueante, un pilar de la programación interactiva.
  * Sintetizar los conceptos de sensores, variables, bucles y condicionales para crear una herramienta funcional.
  * Entender cómo se gestiona el tiempo en aplicaciones que requieren una respuesta continua.

  ### **Inicio (10 minutos) - El Ritmo Preciso**
  1.  Da la bienvenida a la clase: **"Hoy vamos a construir nuestra herramienta más profesional hasta la fecha. Pero para ello, necesitamos resolver un gran problema de la programación: el tiempo."**
  2.  Plantea el problema: "Hemos usado el bloque `esperar`, pero eso 'congela' todo el programa. Mientras espera, no puede leer sensores ni hacer nada más. ¿Cómo podría un videojuego mover a los enemigos *mientras* espera a que el jugador actúe? Usa una lógica de tiempo más inteligente."
  3.  Introduce la solución: **"En lugar de detenerse, los programas profesionales constantemente se preguntan: '¿Ya ha pasado suficiente tiempo para la siguiente acción?'. Hoy aplicaremos esta técnica para construir un metrónomo de DJ, una herramienta que necesita una precisión rítmica perfecta y una respuesta instantánea."**

  {{learn}}

  ### **Desarrollo (20-30 minutos) - Programando el Tempo**
  1.  Este proyecto es conceptualmente denso. Guía a los estudiantes con calma a través de la lógica.
  2.  Ayúdalos a **construir el metrónomo, prestando especial atención a la fórmula matemática y a la estructura condicional `si (tiempoActual - ultimoTiempo) > intervalo`**, como se detalla a continuación. Este es el "corazón" del programa.

  ### **Cierre (5-10 minutos) - La Máquina del Tiempo**
  1.  Una vez que los metrónomos estén marcando el ritmo, es hora de analizar la sofisticada máquina que han construido.
  2.  Pregunta a la clase: **"Describan el flujo de datos y lógica. ¿Cómo se convierte un movimiento en un ritmo preciso? ¿Por qué es absolutamente crucial actualizar la variable `ultimoLatido` cada vez que suena un golpe? ¿Qué pasaría si nos olvidáramos de ese paso?"** (La respuesta: el pulso sonaría sin parar después del primer intervalo, ya que la condición siempre sería verdadera).

  {{reflect}}

# DYNAMIC SECTIONS AS ARRAY
content_sections:

  - id: "learn"
    title: "¿Qué es un Metrónomo?"
    type: "learn"
    icon: "book-reader"
    content: |
      Un metrónomo es una herramienta esencial para los músicos. Produce un pulso o clic a una velocidad constante y ajustable para ayudarles a mantener un tempo estable. La velocidad se mide en **BPM (Beats Per Minute)**, o "Pulsos Por Minuto". Un tempo de 60 BPM significa exactamente un pulso cada segundo.
    media: "src/22.1-dj-metronome/a-metronome.svg"

  - title: "El Problema con 'Esperar'"
    type: "learn"
    content: |
      Nuestro primer instinto podría ser usar un bucle con un bloque `esperar`. Sin embargo, `esperar` **bloquea** el programa. Mientras está en pausa, no puede hacer nada más: no puede leer el sensor de inclinación para ajustar el tempo, no puede actualizar la pantalla, no puede responder a botones. Para una herramienta que necesita ser fluida y responsiva en tiempo real, este método no funciona.
    media: "src/22.1-dj-metronome/b-waiting-problem.es.svg"

  - title: "Lógica de Tiempo Avanzada (No Bloqueante)"
    type: "learn"
    content: |
      Los profesionales usan una lógica que nunca "congela" el programa. Funciona como un cronómetro manual:
      1.  Guardamos el momento exacto en que ocurrió el último pulso en una variable (`ultimoLatido`).
      2.  En un bucle que se ejecuta muy, muy rápido, constantemente calculamos el tiempo que ha pasado: `tiempoActual - ultimoLatido`.
      3.  **SI** ese tiempo transcurrido es **mayor** que nuestro intervalo deseado, ¡sabemos que es hora de un nuevo pulso!
      4.  Cuando ocurre el pulso, el paso más importante es **actualizar `ultimoLatido` al `tiempoActual`**, lo que efectivamente "reinicia" el cronómetro para el siguiente pulso.
    media: "src/22.1-dj-metronome/c-advanced-time-logic.es.svg"

  - title: "Las Matemáticas del Ritmo"
    type: "learn"
    content: |
      Para que nuestra lógica de tiempo funcione, necesitamos calcular el intervalo correcto a partir de los BPM. La fórmula es simple. Sabiendo que hay 60 segundos en un minuto y 1000 milisegundos en un segundo, hay 60.000 milisegundos en un minuto.
      **`Intervalo (en milisegundos) = 60000 / BPM`**
      Usaremos esta fórmula para traducir el tempo que leemos del sensor a la pausa precisa que nuestro programa necesita.
    media: "src/22.1-dj-metronome/d-interval-formula.svg"

  - id: "create"
    title: "Crear"
    type: "create"
    icon: "cogs"
    heading_text: "¡A construir el metrónomo de DJ!"
    steps:
      - "Necesitaremos 2 componentes: <comp>Inclinación</comp> para controlar los BPM y <comp>BateríaMusical</comp> para el sonido del pulso."
      - "Recuerda escanear o abrir todos los componentes."
    ready_message: "¡Estamos listos para programar el ritmo!"

  - title: "Composición del Código"
    type: "code-composition"
    icon: "code"
    content: |
      Dentro del `bucle principal`, primero mapeamos la inclinación a un rango de `bpm`. Luego, aplicamos la fórmula matemática para calcular el `intervaloBeat` necesario. El condicional `si` es el cerebro del metrónomo: compara el tiempo transcurrido desde el `ultimoBeat` con el `intervaloBeat` deseado. Si ha pasado suficiente tiempo, reproduce el sonido y —el paso más importante— actualiza `ultimoBeat` al tiempo actual para que el ciclo pueda comenzar de nuevo.
    media: "[700]https://app.protobject.com/generate?equivalent-metronomo-con-inclinacion&es&dynamic&-1"

  - id: "reflect"
    title: "Reflexiona"
    type: "reflect"
    icon: "lightbulb"
    content:
      - |
        Explica con tus palabras por qué usamos esta lógica de tiempo con variables y milisegundos en lugar de un simple bloque `esperar`.
      - |
        La fórmula para el intervalo es `60000 / BPM`. Si los BPM son 60, ¿cuál es el intervalo? ¿Y si los BPM son 120? ¿El resultado matemático tiene sentido en el mundo real?
      - |
        ¿Qué crees que pasaría si te olvidaras de actualizar la variable `ultimoBeat` dentro del bloque `si`?

    right_content:
      - text: |
            **Desafío:** ¡Añade un control visual! ¿Puedes hacer que una luz parpadee al ritmo del metrónomo? **Pista**: Añade un componente <comp>Lámpara</comp>. Necesitarías encenderla justo cuando suena el pulso, pero también encontrar una manera de apagarla un poco después sin usar un bloque `esperar` que detenga el programa.
      - media: "src/22.1-dj-metronome/e-pulse-light.svg"
---