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