Differenze tra le versioni di "Eseguire una traccia di un CD audio mediante le risorse del Componente gb.media"
(7 versioni intermedie di uno stesso utente non sono mostrate) | |||
Riga 9: | Riga 9: | ||
− | + | Public Sub Main() | |
Dim mp As MediaPlayer | Dim mp As MediaPlayer | ||
− | + | With mp = New MediaPlayer | |
− | + | <FONT Color=gray>' ''Esegue ad esempio la traccia n. 10 del CD:''</font> | |
− | + | .URL = "cdda://<FONT Color=#B22222>10</font>" | |
− | + | .Play | |
− | + | End With | |
− | + | ||
+ | Repeat | ||
<FONT Color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati:''</font> | <FONT Color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati:''</font> | ||
− | + | Write "\rDurata del brano: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000)) | |
− | + | Wait 0.01 | |
− | + | Until (mp.Position >= mp.Duration) Or (bo = True) | |
− | + | mp.Stop | |
+ | mp.Close | ||
+ | Quit | ||
− | + | End | |
− | + | ||
− | |||
+ | Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font> | ||
− | + | bo = True | |
− | + | End | |
− | |||
− | |||
Riga 42: | Riga 43: | ||
Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio: | Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio: | ||
− | + | Private bo As Boolean | |
+ | |||
+ | |||
+ | Public Sub Main() | ||
+ | |||
+ | Dim pl As MediaPipeline | ||
− | + | pl = New MediaPipeline(Null, "playbin") | |
+ | <FONT Color=gray>' ''Esegue ad esempio la traccia n. 10 del CD:''</font> | ||
+ | pl["uri"] = "cdda://<FONT Color=#B22222>10</font>" | ||
− | + | pl.Play() | |
− | |||
− | + | Repeat | |
+ | <FONT Color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati:''</font> | ||
+ | Write "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, pl.Position * 1000)) | ||
+ | Wait 0.001 | ||
+ | Until (pl.Position >= pl.Duration) Or (bo = True) | ||
− | + | pl.Stop | |
− | <FONT Color=gray>' '' | + | pl.Close |
− | + | Quit | |
− | + | ||
− | + | End | |
− | + | ||
− | + | ||
+ | Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
Riga 67: | Riga 83: | ||
Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio: | Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio: | ||
− | + | Private bo As Boolean | |
− | + | ||
+ | |||
+ | Public Sub Main() | ||
+ | |||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src As MediaControl | Dim src As MediaControl | ||
− | + | pl = New MediaPipeline | |
− | + | src = New MediaControl(pl, "playbin") | |
− | + | <FONT Color=gray>' ''Esegue ad esempio la traccia n. 10 del CD:''</font> | |
+ | src["uri"] = "cdda://<FONT Color=#B22222>10</font>" | ||
− | + | pl.Play() | |
− | + | Repeat | |
<FONT Color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati:''</font> | <FONT Color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati:''</font> | ||
− | + | Write "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, pl.Position * 1000)) | |
− | + | Wait 0.001 | |
− | + | Until (pl.Position >= pl.Duration) Or (bo = True) | |
+ | |||
+ | pl.Stop | ||
+ | pl.Close | ||
+ | Quit | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font> | ||
− | + | bo = True | |
+ | |||
+ | End | ||
− | ===Uso del plug-in | + | ===Uso del plug-in ''cdiocddasrc''=== |
− | Volendo evitare il plug-in ''playbin'', è possibile utilizzare il plug-in | + | Volendo evitare il plug-in ''playbin'', è possibile utilizzare il plug-in ''cdiocddasrc'' per la lettura ed esecuzione della traccia audio prescelta. |
Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio: | Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio: | ||
− | + | Private bo As Boolean | |
+ | |||
+ | |||
+ | Public Sub Main() | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src, cnv, snk As MediaControl | Dim src, cnv, snk As MediaControl | ||
− | + | pl = New MediaPipeline | |
− | + | src = New MediaControl(pl, "cdiocddasrc") | |
− | + | <FONT Color=gray>' ''Esegue ad esempio la traccia n. 10 del CD:''</font> | |
− | + | src["track"] = 10 | |
− | + | cnv = New MediaControl(pl, "audioconvert") | |
+ | snk = New MediaControl(pl, "alsasink") | ||
+ | |||
+ | src.LinkTo(cnv) | ||
+ | cnv.LinkTo(snk) | ||
− | + | pl.Play() | |
− | + | ||
+ | Repeat | ||
+ | <FONT Color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati:''</font> | ||
+ | Write "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, pl.Position * 1000)) | ||
+ | Wait 0.001 | ||
+ | Until (pl.Position >= pl.Duration) Or (bo = True) | ||
− | + | pl.Stop() | |
+ | pl.Close() | ||
+ | Quit | ||
− | + | End | |
− | <FONT Color=gray>' '' | + | |
− | + | ||
− | + | Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font> | |
− | + | ||
+ | bo = True | ||
− | + | End | |
− | + | ||
− | |||
− | |||
====Impostazione della frequenza di campionamento (rate) e dei canali, nonché modifica della tonalità e del tempo di esecuzione==== | ====Impostazione della frequenza di campionamento (rate) e dei canali, nonché modifica della tonalità e del tempo di esecuzione==== | ||
Riga 124: | Riga 168: | ||
* per impostare la tonalità si userà l'omonima proprietà "pitch": il valore di partenza predefinito è 1.0; | * per impostare la tonalità si userà l'omonima proprietà "pitch": il valore di partenza predefinito è 1.0; | ||
* per impostare la velocità del tempo di esecuzione si userà la proprietà "tempo": il valore di partenza predefinito è 1.0. | * per impostare la velocità del tempo di esecuzione si userà la proprietà "tempo": il valore di partenza predefinito è 1.0. | ||
+ | |||
+ | Nell'esempio che segue sarà possibile modificare in "''tempo reale''" i valori della tonalità e del tempo mediante due ''Slider'': | ||
Private pl As MediaPipeline | Private pl As MediaPipeline | ||
+ | Private pit As MediaControl | ||
+ | Private pitch As Float = 1.00 | ||
+ | Private tempo As Float = 1.00 | ||
+ | |||
+ | Public Sub Form_Open() | ||
− | + | Dim src, cnv, res, enc, cnv2, snk As MediaControl | |
− | |||
− | Dim src, cnv, res, enc | ||
Dim flt As MediaFilter | Dim flt As MediaFilter | ||
Riga 135: | Riga 184: | ||
src = New MediaControl(pl, "cdiocddasrc") | src = New MediaControl(pl, "cdiocddasrc") | ||
+ | <FONT Color=gray>' ''Esegue ad esempio la traccia n. 2 del CD:''</font> | ||
src["track"] = 2 | src["track"] = 2 | ||
cnv = New MediaControl(pl, "audioconvert") | cnv = New MediaControl(pl, "audioconvert") | ||
Riga 152: | Riga 202: | ||
cnv2.LinkTo(snk) | cnv2.LinkTo(snk) | ||
− | ''' | + | <FONT Color=gray>' ''Imposta alcuni valori dei due "Slider":''</font> |
+ | With Slider1 | ||
+ | .MinValue = 0 | ||
+ | .MaxValue = 1000 | ||
+ | .Value = 100 | ||
+ | End With | ||
+ | |||
+ | With Slider2 | ||
+ | .MinValue = 0 | ||
+ | .MaxValue = 1000 | ||
+ | .Value = 100 | ||
+ | End With | ||
+ | |||
+ | End | ||
− | + | Public Sub Button1_Click() | |
pl.Play() | pl.Play() | ||
− | + | Repeat | |
− | Write | + | Write "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, pl.Position * 1000)) |
Wait 0.01 | Wait 0.01 | ||
− | + | Until (pl.Position >= pl.Duration) | |
− | + | End | |
− | + | Public Sub Button2_Click() | |
− | + | ||
pl.Stop() | pl.Stop() | ||
pl.Close() | pl.Close() | ||
− | + | End | |
+ | |||
+ | |||
+ | Public Sub Slider1_Change() | ||
+ | |||
+ | pitch = Slider1.Value / 100 | ||
+ | pit["pitch"] = pitch | ||
+ | ValueBox1.Value = pitch | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Slider2_Change() | ||
+ | |||
+ | tempo = Slider2.Value / 100 | ||
+ | pit["tempo"] = tempo | ||
+ | ValueBox2.Value = tempo | ||
+ | |||
+ | End | ||
− | ===Uso del plug-in | + | ===Uso del plug-in ''cdparanoiasrc''=== |
− | E' possibile anche utilizzare il plug-in | + | E' possibile anche utilizzare il plug-in ''cdparanoiasrc'' per la lettura ed esecuzione della traccia audio prescelta. |
Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio: | Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio: | ||
− | + | Private bo As Boolean | |
+ | |||
+ | |||
+ | Public Sub Main() | ||
Dim pl As MediaPipeline | Dim pl As MediaPipeline | ||
Dim src, cnv, snk As MediaControl | Dim src, cnv, snk As MediaControl | ||
− | + | pl = New MediaPipeline | |
− | + | src = New MediaControl(pl, "cdparanoiasrc") | |
− | + | <FONT Color=gray>' ''Esegue ad esempio la traccia n. 10 del CD:''</font> | |
− | + | src["track"] = 10 | |
− | + | cnv = New MediaControl(pl, "audioconvert") | |
− | + | snk = New MediaControl(pl, "alsasink") | |
− | + | ||
− | + | src.LinkTo(cnv) | |
− | + | cnv.LinkTo(snk) | |
− | + | ||
− | + | pl.Play() | |
− | + | ||
+ | Repeat | ||
<FONT Color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati:''</font> | <FONT Color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati:''</font> | ||
− | + | Write "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, pl.Position * 1000)) | |
− | + | Wait 0.01 | |
− | + | Until (pl.Position >= pl.Duration) Or (bo = True) | |
− | + | ||
− | + | pl.Stop() | |
− | + | pl.Close() | |
− | + | Quit | |
− | '''End''' | + | |
+ | End | ||
+ | |||
+ | |||
+ | Public Sub Application_Read() <FONT Color=gray>' ''Premendo il tasto "Invio" della tastiera, si arresta il programma''</font> | ||
+ | |||
+ | bo = True | ||
+ | |||
+ | End | ||
+ | |||
+ | |||
+ | Per l'impostazione dei valori della frequenza di campionamento (rate) e dei canali, nonché della tonalità e del tempo di esecuzione, che il file WAV assumerà, il codice avrà la medesima costituzione di quello visto appena sopra per il plugin ''cdiocddasrc''. | ||
Riga 215: | Riga 311: | ||
− | + | Public Sub Form_Open() | |
− | + | ||
Dim mp As MediaPlayer | Dim mp As MediaPlayer | ||
Dim usc As MediaControl | Dim usc As MediaControl | ||
− | + | Me.Show | |
− | + | With mp = New MediaPlayer | |
− | + | <FONT Color=gray>' ''Esegue ad esempio la traccia n. 10 del CD:''</font> | |
− | + | .URL = "<FONT Color=#B22222>cdda://10</font>" | |
+ | End With | ||
− | + | usc = New MediaControl(mp, "jackaudiosink") | |
− | + | mp.Audio.Output = usc | |
− | + | mp.Play() | |
− | + | Repeat | |
<FONT Color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati:''</font> | <FONT Color=gray>' ''Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati:''</font> | ||
− | + | Write "\rDurata del brano: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000)) | |
− | + | Wait 0.01 | |
− | + | Until (mp.Position >= mp.Duration) Or (bo = True) | |
− | + | mp.Stop | |
+ | mp.Close | ||
+ | Me.Close | ||
− | + | End | |
− | + | ||
− | |||
+ | Public Sub Button1_Click() | ||
− | + | bo = True | |
− | |||
− | |||
− | + | End |
Versione delle 08:18, 30 lug 2023
E' possibile eseguire una traccia di un CD audio mediante il Componente gb.media di Gambas, utilizzando alcune sue risorse.
Indice
Uso della sola Classe MediaPlayer
L'utilizzo della sola Classe MediaPipeline del Componente gb.media prevede l'uso del plug-in "playbin"
Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio:
Private bo As Boolean Public Sub Main() Dim mp As MediaPlayer With mp = New MediaPlayer ' Esegue ad esempio la traccia n. 10 del CD: .URL = "cdda://10" .Play End With Repeat ' Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati: Write "\rDurata del brano: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000)) Wait 0.01 Until (mp.Position >= mp.Duration) Or (bo = True) mp.Stop mp.Close Quit End Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si arresta il programma bo = True End
Uso della sola Classe MediaPipeline
L'utilizzo della sola Classe MediaPipeline del Componente gb.media prevede l'uso del plug-in "playbin".
Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio:
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline pl = New MediaPipeline(Null, "playbin") ' Esegue ad esempio la traccia n. 10 del CD: pl["uri"] = "cdda://10" pl.Play() Repeat ' Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati: Write "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, pl.Position * 1000)) Wait 0.001 Until (pl.Position >= pl.Duration) Or (bo = True) pl.Stop pl.Close Quit End Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si arresta il programma bo = True End
Uso della Classe MediaPipeline e della Classe MediaControl
L'esecuzione di una traccia può essere effettuata anche utilizzando le Classi MediaPipeline e MediaControl del Componente gb.media.
Uso del plug-in "playbin"
E' possibile utilizzare il plug-in "playbin" per la letura ed esecuzione della traccia audio prescelta.
Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio:
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "playbin") ' Esegue ad esempio la traccia n. 10 del CD: src["uri"] = "cdda://10" pl.Play() Repeat ' Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati: Write "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, pl.Position * 1000)) Wait 0.001 Until (pl.Position >= pl.Duration) Or (bo = True) pl.Stop pl.Close Quit End Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si arresta il programma bo = True End
Uso del plug-in cdiocddasrc
Volendo evitare il plug-in playbin, è possibile utilizzare il plug-in cdiocddasrc per la lettura ed esecuzione della traccia audio prescelta.
Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio:
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, cnv, snk As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "cdiocddasrc") ' Esegue ad esempio la traccia n. 10 del CD: src["track"] = 10 cnv = New MediaControl(pl, "audioconvert") snk = New MediaControl(pl, "alsasink") src.LinkTo(cnv) cnv.LinkTo(snk) pl.Play() Repeat ' Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati: Write "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, pl.Position * 1000)) Wait 0.001 Until (pl.Position >= pl.Duration) Or (bo = True) pl.Stop() pl.Close() Quit End Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si arresta il programma bo = True End
Impostazione della frequenza di campionamento (rate) e dei canali, nonché modifica della tonalità e del tempo di esecuzione
E' possibile impostare i valori della frequenza di campionamento (rate) e dei canali, nonché modificare la tonalità e il tempo di esecuzione. Quest'ultime due impostazione verranno effettuate con il plugin "pitch", considerando che:
- per impostare la tonalità si userà l'omonima proprietà "pitch": il valore di partenza predefinito è 1.0;
- per impostare la velocità del tempo di esecuzione si userà la proprietà "tempo": il valore di partenza predefinito è 1.0.
Nell'esempio che segue sarà possibile modificare in "tempo reale" i valori della tonalità e del tempo mediante due Slider:
Private pl As MediaPipeline Private pit As MediaControl Private pitch As Float = 1.00 Private tempo As Float = 1.00 Public Sub Form_Open() Dim src, cnv, res, enc, cnv2, snk As MediaControl Dim flt As MediaFilter pl = New MediaPipeline src = New MediaControl(pl, "cdiocddasrc") ' Esegue ad esempio la traccia n. 2 del CD: src["track"] = 2 cnv = New MediaControl(pl, "audioconvert") res = New MediaControl(pl, "audioresample") flt = New MediaFilter(pl, "audio/x-raw,rate=44100,channels=2") pit = New MediaControl(pl, "pitch") pit["pitch"] = 0.9 pit["tempo"] = 1.1 cnv2 = New MediaControl(pl, "audioconvert") snk = New MediaControl(pl, "alsasink") src.LinkTo(cnv) cnv.LinkTo(res) res.LinkTo(flt) flt.LinkTo(pit) pit.LinkTo(cnv2) cnv2.LinkTo(snk) ' Imposta alcuni valori dei due "Slider": With Slider1 .MinValue = 0 .MaxValue = 1000 .Value = 100 End With With Slider2 .MinValue = 0 .MaxValue = 1000 .Value = 100 End With End Public Sub Button1_Click() pl.Play() Repeat Write "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until (pl.Position >= pl.Duration) End Public Sub Button2_Click() pl.Stop() pl.Close() End Public Sub Slider1_Change() pitch = Slider1.Value / 100 pit["pitch"] = pitch ValueBox1.Value = pitch End Public Sub Slider2_Change() tempo = Slider2.Value / 100 pit["tempo"] = tempo ValueBox2.Value = tempo End
Uso del plug-in cdparanoiasrc
E' possibile anche utilizzare il plug-in cdparanoiasrc per la lettura ed esecuzione della traccia audio prescelta.
Mostriamo un semplice esempio, nel quale imposteremo l'esecuzione della traccia num. 10 del CD audio:
Private bo As Boolean Public Sub Main() Dim pl As MediaPipeline Dim src, cnv, snk As MediaControl pl = New MediaPipeline src = New MediaControl(pl, "cdparanoiasrc") ' Esegue ad esempio la traccia n. 10 del CD: src["track"] = 10 cnv = New MediaControl(pl, "audioconvert") snk = New MediaControl(pl, "alsasink") src.LinkTo(cnv) cnv.LinkTo(snk) pl.Play() Repeat ' Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati: Write "\rDurata del brano: " & CStr(Time(0, 0, 0, pl.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, pl.Position * 1000)) Wait 0.01 Until (pl.Position >= pl.Duration) Or (bo = True) pl.Stop() pl.Close() Quit End Public Sub Application_Read() ' Premendo il tasto "Invio" della tastiera, si arresta il programma bo = True End
Per l'impostazione dei valori della frequenza di campionamento (rate) e dei canali, nonché della tonalità e del tempo di esecuzione, che il file WAV assumerà, il codice avrà la medesima costituzione di quello visto appena sopra per il plugin cdiocddasrc.
Uso delle Classi MediaPlayer e MediaControl e del plug-in jackaudiosink
L'uso delle Classi MediaPlayer e MediaControl e del plug-in jackaudiosink richiede che sia preliminarmente avviato il programma server Jack.
Mostriamo un esempio questa volta in ambiente grafico:
Private bo As Boolean Public Sub Form_Open() Dim mp As MediaPlayer Dim usc As MediaControl Me.Show With mp = New MediaPlayer ' Esegue ad esempio la traccia n. 10 del CD: .URL = "cdda://10" End With usc = New MediaControl(mp, "jackaudiosink") mp.Audio.Output = usc mp.Play() Repeat ' Mostra in console la posizione, espressa in secondi, all'interno dei dati audio processati: Write "\rDurata del brano: " & CStr(Time(0, 0, 0, mp.Duration * 1000)) & " - Tempo trascorso: " & CStr(Time(0, 0, 0, mp.Position * 1000)) Wait 0.01 Until (mp.Position >= mp.Duration) Or (bo = True) mp.Stop mp.Close Me.Close End Public Sub Button1_Click() bo = True End