Menú

Mostrar Mensajes

Esta sección te permite ver todos los mensajes escritos por este usuario. Ten en cuenta que sólo puedes ver los mensajes escritos en zonas a las que tienes acceso en este momento.

Mostrar Mensajes Menú

Mensajes - Eleкtro

#8431
Pues eso, si alguien me puede explicar como puedo modificar la ganancia de un Wav...

En un form reproduzco un Wav que lo tengo como archivo de Recurso (my.resources.wave), lo que quiero es poder ajustar el nivel de audio de este Recurso para reproducirlo con un nivel más bajo del máximo (1.000f = Máximo).

Se supone que con la librería NAudio se puede conseguir esto, pero sólo he llegado hasta aquí:
Código (vbnet) [Seleccionar]
Public wavefile As New NAudio.Wave.WaveFileReader("C:\Archivo.wav")

la class tiene miles de métodos y no son nada claros para mi, no sé como hacerlo.

Si alguien conoce otro método para conseguir esto no tiene importancia, no dependo de dicha librería, sólo es que ...es lo único que he encontrado sobre el tema.






Aquí tienen la Lib, por si alguien puede ayudar echándole un vistazo:
http://naudio.codeplex.com/
PD: Los ejemplos son en C#,
hay una "demoApp" que hace exáctamente lo que quiero, pero todo el code es demasiado Pro para mi nivel a la hora de intentar trasladar lo que necesito a VB.



Creo que la parte interesante del source de la Demo está aquí:

Código (csharp) [Seleccionar]
       namespace NAudioDemo.AudioPlaybackDemo

       this.fileWaveStream = plugin.CreateWaveStream(fileName);
       var waveChannel =  new SampleChannel(this.fileWaveStream, true);
       this.setVolumeDelegate = (vol) => waveChannel.Volume = vol;
       waveChannel.PreVolumeMeter += OnPreVolumeMeter;

       var postVolumeMeter = new MeteringSampleProvider(waveChannel);
       postVolumeMeter.StreamVolume += OnPostVolumeMeter;

...Obviamente falta mucho más código necesario, pero es que es muy, muy, muy extensa.

Saludos
#8432
Para añadir algo de información a la respuesta de Novlucker he hecho un ejemplo práctico:

EDITO: Justo ahora leí que era para C#, sorry, pero igual te puede servir.

Código (vbnet) [Seleccionar]
Public Class Form1

   ' Creamos dos objetos de tipo {Button} con algunas propiedades :

   Dim WithEvents objeto1 As Button = New Button _
   With {.Name = "Boton1", _
         .AutoSize = True, _
         .Tag = "Botoncito 1", _
         .Text = "Soy el botón 1, púlsame!", _
         .Font = New Font("Microsoft Sans Serif", 16, FontStyle.Bold), _
         .Dock = DockStyle.Top}

   Dim WithEvents objeto2 As Button = New Button _
   With {.Name = "Boton2", _
         .AutoSize = True, _
         .Tag = "Botoncito 2", _
         .Text = "Soy el botón 2, púlsame!", _
         .Font = New Font("Microsoft Sans Serif", 16, FontStyle.Bold), _
         .Dock = DockStyle.Bottom}

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
       ' Asociamos un {evento} de los objetos a un {eventhandler} :
       AddHandler objeto1.MouseDown, AddressOf objeto_Click
       AddHandler objeto2.MouseDown, AddressOf objeto_Click
       ' Añadimos los controles al formulario :
       Me.Controls.Add(objeto1) : Me.Controls.Add(objeto2)
   End Sub

   Private Sub objeto_Click(sender As Object, e As MouseEventArgs) ' Handles objeto1.MouseDown, objeto2.MouseDown

       ' El objeto que recibe el sender es de tipo {Button}, el sender equivale a uno de nuestros botones :

       MsgBox(String.Format("Name: {0}Tag: {1}Text: {2}", _
                            sender.Name & Environment.NewLine, _
                            sender.tag & Environment.NewLine, _
                            sender.Text & Environment.NewLine))

       ' Pero en algunos casos querremos convertir el sender al tipo de objeto en cuestión,
       ' por ejemplo en este caso para diferenciar entre un botón y otro :

       Dim Boton As Button = CType(sender, Button)

       Select Case Boton.Name
           Case "Boton1" ' El botón se llama "Boton1"
               MsgBox("Esto sucede al pulsar el botón: " & Boton.Name)
               ' Código...
           Case "Boton2" ' El botón se llama "Boton2"
               MsgBox("Esto otro sucede al pulsar el botón: " & Boton.Name)
               ' Más código...
       End Select

       ' Una muestra de como manejar {e} para el tipo de evento {MouseEventArgs} :
       MsgBox("Pulsaste el botón de tu mouse: " & e.Button.ToString)

   End Sub

End Class


Saludos.
#8433
Scripting / Re: QPF to Chapter file
13 Julio 2013, 04:10 AM
No me molesta aunque si te fijas esto más bien es un tutorial express, lo del cint, el for y los "tokens", y etc no te habría costado nada encontrarlo en Google xD, de hecho yo estaba usando el Split como si fuese un método porque estoy acostumbrado a eso en el resto d elenguajes, y tuve que Googlear para ver que en VBS Split es una función y por lo tanto se escribe delante.

un saludo.
#8434
Scripting / Re: QPF to Chapter file
13 Julio 2013, 04:01 AM
Cita de: ovichan en 13 Julio 2013, 03:52 AMvbs me redondea automaticamente los valores de los resultados inmediatos a su numero entero superior

Es lo que hace la función "Cint", usa "Int" en su lugar.

Por cierto, podrías evitar el uso de if's anidados, no lo soporto, con lo bonito y organizado que queda un Case:

Código (vbnet) [Seleccionar]
' Variables
Const constante = 0.0417083

' Do until qpfile.AtEndOfStream

set qpfile=createobject("scripting.filesystemobject").Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
qpfile.readline()

'Filtrar linea, para quedarnos con el numero del frame
For each token in split(qpfile.readline())
    tratar(token)
exit For
Next

' Loop

Wscript.quit

'Subrutina para transformar numero entero en timestamp
Sub Tratar(Frame)

'Establecemos criterio de comparación
calculo  = (Frame * constante)
p_entera = int(calculo)

Select Case p_entera

Case p_entera >= 216000 'Mensaje de error
hora=normalizar(calculo)
msgbox("Error. Un video no puede tener una duracion continua igual a un o mas días.")

Case p_entera >= 3600 'Calculo de timecodes partiendo de horas
msgbox("hola1")

Case p_entera < 3600 AND p_entera >= 60 ' Calculo de timecodes partiendo de minutos
min=calculo\60
seg=calculo mod 60
ms=round(((((calculo/60)-min)*60)-seg),3)*1000
msgbox(min & " min. " & seg & " seg. " & ms & " ms. ")

Case p_entera < 60 AND p_entera >= 0 'Calculo de timecodes partiendo de segundos
msgbox("hola3")

Case ELSE
msgbox("Error. No pueden existir valores negativos.")

End select

End Sub


PD: No lo he testeado, pero ya te haces una idea.

Saludos!
#8435
Scripting / Re: QPF to Chapter file
13 Julio 2013, 03:41 AM
Cita de: ovichan en 13 Julio 2013, 03:05 AM¿Más que un procedimiento, no debería ser una función?

Vamos a ver, no veo que intentes retornar ningún valor ni que tengas planeado hacerlo en un futuro, tal y como lo estás haciendo vas bien, aunque yo lo haría todo dentro del For, pero usa un proc si sigues así ...usa una función si quieres tratar los valores fuera del bloque de la subrutina, en el Ciclo del For.

Óbviamente si deseas "tratar" las variables del proc fuera del proc primero tienes que declararlas...

Código (vb) [Seleccionar]
dim hora

sub blabla
   hora = X
end sub

msgbox(hora)


saludos
#8436
Scripting / Re: QPF to Chapter file
13 Julio 2013, 02:39 AM
Si el problema es que necesitas saltar la primera línea del archivo pues ejecuta esta instrucción 2 veces:

Código (vb) [Seleccionar]
...

qpfile.readline() : linea=qpfile.readline() ' leemos dos lineas, pero nos quedamos con la segunda.

For each token in split(linea, " ") ...
...


EDITO: Si no es eso pues da más detalles... pero ten en cuenta antes de preguntar que puedes usar condicionales...

Código (vb) [Seleccionar]
if not "a" = "A" then   : Wscript.Echo "no" : end if
if Instr("a", "a") then : Wscript.Echo "si" : end if


Saludos
#8437
Windows / Re: "Enviar a "
12 Julio 2013, 21:30 PM
Como te ha dicho drvy siempre se copian, y NO SE PUEDE MODIFICAR.

Aquí tienes una alternativa que hice en Ruby:

[RUBY] (APORTE) MoveIt (Complemento para el menú SendTo de Windows)

Es bien fácil de usar y en el post tienes las instrucciones,
la idea fue modificar la ruta en las propiedades de los accesos directos para ejecutar mi aplicación y pasarle como argumento dicha carpeta, y así trabajar con esa carpeta (mover archivos), por esa razón no es necesario crear nuevas entradas como dijo drvy, ni nada parecido, símplemente se ejecuta la aplicación y mueve los archivos, aquí tienes unas imágenes:





PD: Compila el script para que no te muestre la ventana del intérprete de Ruby y listo, todo será "oculto" ;).

Saludos.
#8438
Scripting / Re: QPF to Chapter file
12 Julio 2013, 20:32 PM
Cita de: ovichan en 12 Julio 2013, 19:49 PM¿Se puede hacer como en dos, crear una etiqueta (procedimiento) desde el interior del bucle??

Cualquier cosa que haga Batch se puede hacer en otro lenguaje, y mejor xD :

Código (vb) [Seleccionar]
Set   TextFile = createobject("scripting.filesystemobject").Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)
Const Constant = 0.0417083

Do Until TextFile.AtEndOfStream

For Each Token in split(TextFile.readline()) ' Te hago saber que por defecto un token es separado por un "espacio".
       Tratar(Token)
Next
 
Loop

Wscript.quit

Sub Tratar(Token)
MsgBox(Token)
End Sub
#8439
Scripting / Re: QPF to Chapter file
12 Julio 2013, 19:37 PM
Código (vb) [Seleccionar]
set qpfile=createobject("scripting.filesystemobject").Opentextfile("C:\Users\Isra\Desktop\Nueva carpeta\10. QPFILE_NAME.qpf",1)

Do until qpfile.AtEndOfStream
linea=qpfile.readline()
' o msgbox(qpfile.readline())
Loop


saludos
#8440
Scripting / Re: QPF to Chapter file
12 Julio 2013, 18:50 PM
Cita de: ovichan en 12 Julio 2013, 18:42 PM
Se puede hacer un filtrado por tokens de un for de dos, en vbs??

Código (vb) [Seleccionar]
str = "a-b-c-d-e-f"

For each token in split(str, "-")
   wscript.echo(token)
next


Saludos