¿ Cómo generar música o melodía básica en VBA?

No se VBA y estoy tratando de generar algo de "música" modificando los parámetros a partir de un formulario en la hoja Excel. Ya que no tengo el parámetro "intensidad" esa es mi primera pregunta ¿como agregar ese parámetro a "frecuencia" y duración"

ADEMÁS, Imagino que para gran cantidad de sonidos habrá la posibilidad de hacer más eficiente la macro con algún tipo de string...
Hasta ahora estaba probando con:

Private Declare PtrSafe Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
____________________________________________________________________________

Sub beep3()
'Beep frecuencia duracion
Beep (Range("A3")), (Range("B6"))
End Sub

*Pero me da fallas de sintaxis o compilación. El encabezado es para 64 bits

Respuesta
1

Yo contesté a una pregunta parecida. Si quieres mira si te sirve para algo: https://www.todoexpertos.com/preguntas/7xbadcockmsgvy8o/como-seria-la-macro-para-que-ejecute-7-sonidos-particulares-segun-numeros-del-1-al-7?selectedanswerid=7xfk5cywhxrn8bdu

Y no, que yo sepa lo único que se puede establecer con beep es la frecuencia y la duración.

Saludos_

¡Gracias! Lo recordaré,

Saludos

Hola 2 consultas:

1) ¿Es posible generar más de un «beso» con otros parámetro cada uno formando así una polifonía?

2) Si quisiera generar varios pares de parámetros, por ejemplo 100 para generar un melodía completa, ¿Podría llenar los pares en un hoja Excel para que sean llamados por la Macro?

Muchas Gracias

Saludos

1) Hasta donde yo sé no es posible tocar más de una nota la mismo tiempo con Beep. Creo que en los inicios de los videojuegos se simulaba polifonía haciendo sonar muy rápidamente arpegios, pero he hecho una prueba y Beep no parece ser capaz de nada parecido.

2) Si tienes un rango de dos columnas en el que la celda de la izquierda de cada fila es el semitono (del 1 al 12) a tocar, y la celda de la derecha es la duración de la nota, debería ser posible que suene algo parecido a una melodía usando el siguiente código:

Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Sub prueba()
    Dim vFrecuencias() As Variant, lFila As Long
    vFrecuencias = Array(261.626, 277.183, 293.665, 311.127, 329.628, 349.228, 369.994, 391.995, 415.305, 440, 466.164, 493.883, 523.251)
    For lFila = 1 To Selection.Rows.Count
        If Selection.Cells(lFila, 1) > 0 Then
            Beep vFrecuencias(Selection.Cells(lFila, 1).Value - 1), Selection.Cells(lFila, 2).Value
        Else
            Beep 0, Selection.Cells(lFila, 2).Value
        End If
    Next lFila
End Sub

Para los silencios habría que poner un cero en la celda de la izquierda y la duración del silencio en la de la derecha.

Lógicamente sería posible cambiar de octava sustituyendo las frecuencias por las de la octava que sea hacia arriba o hacia abajo, o ampliando la matriz y utilizando más números (1 a 36 para 3 octavas, por ejemplo)

Saludos_

Muchas Gracias

2  consultas:

1) ¿Cómo se justificaría el código para que estén ordenados los pares en 2 celdas, la de ARRIBA representa el tono y la de abajo la frecuencia?. Esto formaría un fila de tonos y otra abajo de frecuencias.

2) ¿Porqué haces referencia a los semitonos y no a los tonos directamente?

Muchas Gracias !

1) Si el número de semitono está en la fila 1 del rango y su duración en la fila 2:

Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
Sub prueba2()
    Dim vFrecuencias() As Variant, lColumna As Long
    vFrecuencias = Array(261.626, 277.183, 293.665, 311.127, 329.628, 349.228, 369.994, 391.995, 415.305, 440, 466.164, 493.883, 523.251)
    For lColumna = 1 To Selection.Columns.Count
        If Selection.Cells(1, lColumna).Value > 0 Then
            Beep vFrecuencias(Selection.Cells(1, lColumna).Value - 1), Selection.Cells(2, lColumna).Value
        Else
            Beep 0, Selection.Cells(2, lColumna).Value
        End If
    Next lColumna
End Sub

2) Porque teniendo los 12 semitonos es posible construir cualquier escala (por ejemplo, la escala ascendente de Do mayor [a falta del Do agudo] sería 1 3 5 6 8 10 12), y porque además con los 12 semitonos es posible hacer modulaciones e introducir alguna alteración si se necesita o se desea, mientras que si sólo se tienen las 7 notas "blancas" se puede tocar poco más que el cumpleaños feliz y piezas igual de "complicadas"

Saludos_

1 respuesta más de otro experto

Respuesta
1

[Hola

Lo primero es comentarte que a las funciones de la API de Windows (y a otras en general) no se les puede agregar parámetros, todo tiene que ser basado en los que ya tienen.

Segundo, si tu idea es hacer algo que reproduzca sonidos, digamos, tipo notas musicales, no te preocupes, al tener aquellos diversas frecuencias, sí puedes hacer algo medianamente parecido, solo hace falta usar la frecuencia correspondiente:

http://adriansena.galeon.com/aficiones2321141.html 

Ojo que en esa web usan la coma como separador decimal.

Tercero, la función Beep por suerte tiene un rango de frecuencias de entre 37 y 32767 y puede usarse con decimales y que la duración es en mili segundos.

Cuarto, y último, intenta así si quieres obtener los valores de las celdas:

Beep Range("A1"), Range("B1")

No olvidar que los números de las celdas deben cumplir los mismos requisitos que si se envía directamente valores a la función.

Comentas

Abraham Valencia

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas