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

) 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 !
)
Rispondi quotando