Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    33

    [Visual basic 2010] Analizzatore di suoni

    Ciao a tutti, dovrei realizzare un programma che riesce a mandare in esecuzione la musica e la analizzi per poi accendere dei led dalla porta parallela in base al ritmo. Ho trovato un programma, in licenza GNU GPL, che avvia un file musicale (.wav) e crea in una picturebox 3 spettrometri a scelta, io ho utilizzato per comodità quello con due rettangoli che si allungano in base al ritmo della musica. A questo punto tramite i comandi di acquisizione dei pixel (in modo molto spartano ) dico che se il pixel in questione è di colore nero (quindi i rettangoli allungandosi raggiungono il pixel in questione) attivs l' istruzione "PortOut(&h378, x)" per accendere i led occorrenti. Ora vi chiedo se mi potete dare una mano ad alleggerire il codice perchè così facendo servirebbe un computer abbastanza potente per analizzare in un millesimo di secondo la picturebox (e molte altre istruzioni contemporaneamente) e praticamente (col mio pentium a 700 MHz) mi va a scatti (anche se funziona ! )
    Grazie per l' attenzione e spero mi possiate dare una mano .

    Ecco il link del programma (senza mie modifiche) :

    http://www.pierotofy.it/pages/sorgen...972-WaveProof/

    Ecco le modifiche apportate da me sul codice Form1.vb 8ho rimosso tutti gli altri visualizzatori (onda e a sfumatura) e ho messo il comando per analizzare il pixel:

    codice:
    Option Explicit On
    Imports Microsoft.DirectX.AudioVideoPlayback
    Public Class Form1
        Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte)
        Private Wave As CWAVReader
        Private StartTime As Date
        Private File As String
        Private Manager As WaveDataManager
        Public Player As Audio
    
        Private Sub btnLoad_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnLoad.Click
            Dim Open As New OpenFileDialog
            Open.Filter = "Wave|*.wav"
            If Open.ShowDialog = Windows.Forms.DialogResult.OK Then
                Wave = Nothing
                Manager = Nothing
                Me.Enabled = False
                lblStatus.Text = "Attendere, apertura in corso..."
                Application.DoEvents()
                Wave = New CWAVReader(Open.FileName)
                Manager = New WaveDataManager(Wave.GetSoundDataValue(), Wave.ByteRate)
                Manager.CompressData(tmrRefresh.Interval / 1000)
                picWave.Image = Manager.GetWaveForm(picWave.Width, picWave.Height)
                picWave.Refresh()
                File = Open.FileName
                If Player Is Nothing Then
                    Player = New Audio(File)
                Else
                    Player.Open(File)
                End If
                Me.Enabled = True
                Application.DoEvents()
                lblStatus.Text = "File aperto"
                btnPlay.Enabled = True
                btnStop.Enabled = True
            End If
        End Sub
        Private Sub btnPlay_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPlay.Click
            If Manager Is Nothing Then
                MessageBox.Show("Caricare un file prima di procedere!", Me.Text, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
                Exit Sub
            End If
            Manager.Visualizer = New RectangleVisualizer(Manager)
            Manager.Visualizer.ForeColor = Color.Black
            Manager.Visualizer.BackgroundColor = Color.White
            Player.Play()
            tmrRefresh.Start()
            Timer1.Start()
        End Sub
        Private Sub tmrRefresh_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles tmrRefresh.Tick
            Dim TotalSeconds As Double = Player.CurrentPosition
            If Player.CurrentPosition = Player.Duration Then
                tmrRefresh.Stop()
            End If
            If TotalSeconds = 0 Then
                Exit Sub
            End If
            picWave.Image = Manager.Visualizer.Render(picWave.Width, picWave.Height, TotalSeconds - 5500 / 1000, TotalSeconds)
        End Sub
        Private Sub btnPause_Click(ByVal sender As System.Object, ByVal e As System.EventArgs)
            If Player IsNot Nothing Then
                tmrRefresh.Stop()
                Player.Pause()
                Timer1.Stop()
            End If
        End Sub
        Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
            Dim immagine As New Bitmap(picWave.Image)
            Timer1.Interval = 1
            '275 la metà
    ' analizza il pixel, se è nero attiva la porta parallela
            If immagine.GetPixel(295, 100).ToArgb = Color.Black.ToArgb Then
                PortOut(&H378, 1)
            Else         
            End If
            If immagine.GetPixel(315, 100).ToArgb = Color.Black.ToArgb Then
                PortOut(&H378, 3)
            End If
            If immagine.GetPixel(330, 100).ToArgb = Color.Black.ToArgb Then
                PortOut(&H378, 7)
                End If
            If immagine.GetPixel(350, 100).ToArgb = Color.Black.ToArgb Then
                PortOut(&H378, 15)    
            End If
            If immagine.GetPixel(370, 100).ToArgb = Color.Black.ToArgb Then
                PortOut(&H378, 31)
            End If
            If immagine.GetPixel(385, 100).ToArgb = Color.Black.ToArgb Then
                PortOut(&H378, 63)     
            End If
            If immagine.GetPixel(405, 100).ToArgb = Color.Black.ToArgb Then
                PortOut(&H378, 127)
            End If
            If immagine.GetPixel(425, 100).ToArgb = Color.Black.ToArgb Then
                PortOut(&H378, 255)    
            End If
        End Sub
        Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
            End
        End Sub
        Private Sub TextBox1_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs)
        End Sub
        Private Sub btnStop_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnStop.Click
            If Player IsNot Nothing Then
                tmrRefresh.Stop()
                Player.Stop()
                Timer1.Stop()
            End If
        End Sub
    End Class

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Avendo a disposizione il sorgente, non capisco perché non intervieni sulla parte che visualizza le informazioni in modo da attivare i LED direttamente.
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    33
    Sinceramente non ci ho pensato , ora controllo il sorgente per capirne un po il funzionamento, ci vorrà un po, vediamo come va, intanto se qualcuno ha delle idee le dica

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    33
    Mi serve una mano per prelevare il contenuto di "Step1", "Step2" e "Step3" per ricevere le coordinate dei punti in tempo reale, si trovano nella funzione "WaveFormVisualizer" penso che siano quelle le variabili che creano le immagini, però come faccio ad immagazzinarle in una textbox per esempio ? Grazie.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jun 2012
    Messaggi
    33
    PS: si trovano all' interno della funzione "Render" che da come dato in "return" la variabile B, ossia un' immagine, se io volessi che in uscita ci siano proprio i 3 Step ?

  6. #6
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Ma perché devi "tirare fuori" dei valori? Aggiungi le tue PortOut dove serve all'interno del codice ...
    No MP tecnici (non rispondo nemmeno!), usa il forum.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.