I need a gap! ~ How do I pause *after* a song?

Download and get help for different MediaMonkey for Windows 4 Addons.

Moderators: Peke, Gurus

Soren Werk
Posts: 29
Joined: Sat Jan 12, 2008 1:24 pm
Location: Denmark
Contact:

I need a gap! ~ How do I pause *after* a song?

Post by Soren Werk »

I often DJ a tango "milonga" (argentine tango ball).

Tango dancers expect a short break between each song. Incredibly this is not an option in MM! So I started scripting, and this is what I've come up with so far.

Code: Select all

'======================================================================
'
' MediaMonkey AutoScript - GapPause.vbs
'
' Pauses a few seconds before each song thus creating a silent gap between songs.
' 
' 2008-01-22 - Soren Werk - www.tangoman.dk
'
' TODO:
'   Not ready for release
'   Should pause *after* song instead of before
'   Pauses before first song
'   Pauses just before prior song is finished - and finishes it after the pause
'   Pause time should be configurable in Options
'
'======================================================================

Option Explicit

Sub OnStartUp()
  Script.RegisterEvent SDB, "OnPlay", "PauseBefore"
End Sub

Sub PauseBefore()
  SDB.Player.Pause

  Dim Tmr : Set Tmr = SDB.CreateTimer(10000)
  Script.RegisterEvent Tmr, "OnTimer", "UnPause" 
End Sub

Sub UnPause(Timer)
  SDB.Player.Pause

  Script.UnregisterEvents Timer
End Sub
The latest version of this script can be found here

As you see, I pause before each song is played. But of course I want to pause after. How do I do that?

http://www.tangoman.dk
Last edited by Soren Werk on Tue Aug 19, 2008 3:06 am, edited 4 times in total.
Soren Werk
Posts: 29
Joined: Sat Jan 12, 2008 1:24 pm
Location: Denmark
Contact:

Post by Soren Werk »

Wow! That's hard to accept!

So I will join you in your quest to find a solution - even if it means learning about Winamp Plugin Architecture. :-?
I am inspired by your script "Stop After Current". But we must find a solution...
rovingcowboy
Posts: 14163
Joined: Sat Oct 25, 2003 7:57 am
Location: (Texas)
Contact:

Post by rovingcowboy »

i believe winamp is only able to pause before a song.

i use the old plugin program called Djamp where it uses the Microsoft Agents to say the name of the song, and a stupid or some triva comment about it or anything you want it to say.

it will read the upcoming title when it is picked before it starts playing. and pause it then say what it has to and start it.

i know it is before the song plays because sometimes it does not catch the keyword it looks for at the start, and i hear about a second of the song before it pauses it.

so i don't think even winamp pauses after the song.
:-?
roving cowboy / keith hall. My skins http://www.mediamonkey.com/forum/viewto ... =9&t=16724 for some help check on Monkey's helpful messages at http://www.mediamonkey.com/forum/viewto ... 4008#44008 MY SYSTEMS.1.Jukebox WinXp pro sp 3 version 3.5 gigabyte mb. 281 GHz amd athlon x2 240 built by me.) 2.WinXP pro sp3, vers 2.5.5 and vers 3.5 backup storage, shuttle 32a mb,734 MHz amd athlon put together by me.) 3.Dell demension, winxp pro sp3, mm3.5 spare jukebox.) 4.WinXp pro sp3, vers 3.5, dad's computer bought from computer store. )5. Samsung Galaxy A51 5G Android ) 6. amd a8-5600 apu 3.60ghz mm version 4 windows 7 pro bought from computer store.
DaledeSilva
Posts: 906
Joined: Sun May 28, 2006 4:22 am
Location: Australia
Contact:

Post by DaledeSilva »

this is an ad hoc solution... but how acurate is a timerevent?

when a song starts, you could register an event for the songs length... when that time passes, the event fires (at the end of the song) and pauses.

could that work?
Product Designer & Indie Developer.
Building at the intersection of motion, art, and code.
Find me on twitter and all the other ones here.
Teknojnky
Posts: 5537
Joined: Tue Sep 06, 2005 11:01 pm
Contact:

Post by Teknojnky »

I had considered doing that, but like you ask, I don't know the accuracy of the timer.. and further it would become more complex regarding files which are skipped or paused etc...

not to mention, that you would lose the playtime/playcount update..
Soren Werk
Posts: 29
Joined: Sat Jan 12, 2008 1:24 pm
Location: Denmark
Contact:

Post by Soren Werk »

I'm beginning to accept that, as there is no "OnPlayEnd" event, it is only possible to make a gap before a song - not after. And of course, there's nothing wrong with that, except that it makes a gap before the first song too, unless the feature is first turned on during song play.

So I have revised my script so you have to press a button to turn on the feature. I got that idea from Teknojnky's StopPause script. Thank you. :D

Code: Select all

'======================================================================
' MediaMonkey AutoScript - GapBefore.vbs
'
' Pauses a few seconds before each song, thus creating a gap between songs.
' Must be activated by the new PauseBefore button on the standard toolbar.
' Best activated during song play - or there will a pause before the first song too.
'
' 2008-01-23 - Soren Werk - www.tangoman.dk
'
' TODO:
'   Should pause *after* song instead of before
'   Pause time should be configurable in Options
'   Cuts off a bit of the prior song and plays it after the pause
'======================================================================

Option Explicit

Const GapSeconds = 5
Const OnIcon = 1
Const OffIcon = 2
Const OnCaption = "Turn off 'PauseBefore'"
Const OffCaption = "Turn on 'PauseBefore' (Pauses 5 seconds before each song)"

Sub OnStartUp()
  AddToolbarButton_PauseBefore
End Sub

Sub AddToolbarButton_PauseBefore ()
  Dim Button
  Set Button = SDB.UI.AddMenuItem(SDB.UI.Menu_TBStandard,0,0)
  Button.IconIndex = OffIcon
  Button.Caption = OffCaption
  Button.OnClickFunc = "OnClickPauseBefore"
  Button.UseScript = Script.ScriptPath
  SDB.Objects("ButtonPauseBefore") = Button
End Sub

Sub OnClickPauseBefore(Button)
  Button.Checked = not Button.Checked
  If Button.Checked Then
    SDB.Objects("ButtonPauseBefore").IconIndex = OnIcon
    SDB.Objects("ButtonPauseBefore").Caption = OnCaption
    Script.RegisterEvent SDB, "OnPlay", "PauseBefore"
  Else
    SDB.Objects("ButtonPauseBefore").IconIndex = OffIcon
    SDB.Objects("ButtonPauseBefore").Caption = OffCaption
    Script.UnRegisterEvents SDB
  End If
End Sub

Sub PauseBefore()
  SDB.Player.Pause
  Dim Timer : Set Timer = SDB.CreateTimer(1000 * GapSeconds)
  Script.RegisterEvent Timer, "OnTimer", "UnPause" 
End Sub

Sub UnPause(Timer)
  SDB.Player.Pause
  Script.UnregisterEvents Timer
End Sub
Thank you all! 8)
Last edited by Soren Werk on Tue Aug 19, 2008 2:45 am, edited 1 time in total.
Soren Werk
Posts: 29
Joined: Sat Jan 12, 2008 1:24 pm
Location: Denmark
Contact:

Countdown display?

Post by Soren Werk »

Now I would like to display a countdown during the gap. 5 - 4 - 3 - 2 - 1
Any sugestions?
Teknojnky
Posts: 5537
Joined: Tue Sep 06, 2005 11:01 pm
Contact:

Post by Teknojnky »

try this, should work (haven't tested)

Code: Select all

Sub PauseBefore() 
  SDB.Player.Pause 
  Dim Timer : Set Timer = SDB.CreateTimer(1000) 
  Script.RegisterEvent Timer, "OnTimer", "UnPause" 
  Dim Countdown : Set Countdown = SDB.Progress
  Countdown.Value = 0
  Countdown.MaxValue = GapSeconds+1
  Countdown.Text="Paused: " & Progress.Value & " of " Progress.MaxValue-1
End Sub 

Sub UnPause(Timer) 
  Countdown.Increase
  Countdown.Text="Paused: " & Countdown.Value & " of " Countdown.MaxValue-1

  If Coundown.Value = GapSeconds Then
    SDB.Player.Pause 
    Script.UnregisterEvents Timer 
  End If
End Sub 
edit: whoops fixed to countdown object not progress object :o
Soren Werk
Posts: 29
Joined: Sat Jan 12, 2008 1:24 pm
Location: Denmark
Contact:

Post by Soren Werk »

Thanks for the countdown bar Teknojnky - it works just fine!

Now I'm wondering why I can't turn off the PauseBefore effect? I thought Script.UnRegisterEvents SDB was supposed to take care of that - but it's not working! I guess I'll have to read more about Script.UnRegisterEvents and Script.UnRegisterAllEvents somewhere. It doesn't say much in the wiki.

By the way - I stopped using SDB.Objects as a container for my Button and I don't see any adverse effects of that.

Code: Select all

'======================================================================
' MediaMonkey AutoScript - GapBefore.vbs
'
' Pauses a few seconds before each song, thus creating a gap between songs.
' Must be activated by the new PauseBefore button on the standard toolbar.
' Should be activated during song play to avoid pause before the first song.
'
' 2008-01-24 - Soren Werk - www.tangoman.dk
'
' TODO:
'   PauseBefore cannot be turned off!!
'   Should pause *after* song instead of before
'   Pause time should be configurable in Options
'   Cuts off a bit of the prior song and plays it after the pause
'======================================================================

Option Explicit

Const GapSeconds = 10
Const OnIcon = 1
Const OffIcon = 2
Const OnCaption = "Turn off 'PauseBefore'"
Const OffCaption = "Turn on 'PauseBefore' (Pauses a few seconds before each song)"

Dim PauseProgress

Sub OnStartUp()
  AddToolbarButton_PauseBefore
End Sub

Sub AddToolbarButton_PauseBefore ()
  Dim Button : Set Button = SDB.UI.AddMenuItem(SDB.UI.Menu_TBStandard,0,0)
  Button.IconIndex = OffIcon
  Button.Caption = OffCaption
  Button.OnClickFunc = "OnClickPauseBefore"
  Button.UseScript = Script.ScriptPath
End Sub

Sub OnClickPauseBefore(Button)
  Button.Checked = not Button.Checked
  If Button.Checked Then
    Button.IconIndex = OnIcon
    Button.Caption = OnCaption
    Script.RegisterEvent SDB, "OnPlay", "PauseBefore"
  Else
    Button.IconIndex = OffIcon
    Button.Caption = OffCaption
    Script.UnRegisterEvents SDB
  End If
End Sub

Sub PauseBefore()
  SDB.Player.Pause
  Dim Timer : Set Timer = SDB.CreateTimer(1000)
  Script.RegisterEvent Timer, "OnTimer", "UnPause"

  Set PauseProgress = SDB.Progress
  PauseProgress.MaxValue = GapSeconds
  SetProgressText
End Sub

Sub UnPause(Timer)
  PauseProgress.Increase
  SetProgressText

  If PauseProgress.Value = PauseProgress.MaxValue Then
    If SDB.Player.isPaused Then
      SDB.Player.Pause ' Turn off pause
    End If
    
    Script.UnregisterEvents Timer
    Set Timer = nothing
    Set PauseProgress = nothing
  End If
End Sub

Sub SetProgressText
  PauseProgress.Text="Pause between songs " & GapSeconds - PauseProgress.Value & " seconds."
End Sub
Soren Werk
Posts: 29
Joined: Sat Jan 12, 2008 1:24 pm
Location: Denmark
Contact:

Getting better all the time!

Post by Soren Werk »

Getting better all the time!

Allright - so I learned some more about UnRegistrerEvents from this Topic by Teknojnky with very relevant postings by trixmoto and jiri. Thank you very much!

I have only one problem left: How do I turn off the progress indicator when I click (>) to manually start a song during the pause? How do I detect a click on the (>) button.

Code: Select all

'======================================================================
' MediaMonkey\Scripts\Auto\PauseBefore.vbs
'
' Pauses a few seconds before each song, thus creating a gap between songs.
' Must be activated by clicking the PauseBefore button on the standard toolbar.
' Activate during first song play to avoid pause before the first song.
'
' 2008-01-31 - Soren Werk - www.tangoman.dk
'
' ToDo:
'   Turn off progress indicator when pressing (>) during the pause.
'   Cuts off a bit of the prior song and plays it after the pause.
'   Pause time should be configurable in Options.
'   Should pause *after* song instead of before.
'======================================================================

Option Explicit

Const PauseBeforeSeconds = 15

Dim PauseBeforeOn
Dim PauseBeforeButton
Dim PauseBeforeProgress
Dim PauseBeforeTimer
Dim FirstSongStarted

Sub OnStartUp()
  InitButton
  InitOnPlay
  InitTimer
End Sub

Sub InitButton()
  Set PauseBeforeButton = SDB.UI.AddMenuItem(SDB.UI.Menu_TBStandard,0,0)
  PauseBeforeButton.IconIndex = 2
  PauseBeforeButton.Caption = "Turn 'PauseBefore' on and off"
  Script.RegisterEvent PauseBeforeButton, "OnClick", "OnPauseBeforeButtonClick"
  OnPauseBeforeButtonClick(PauseBeforeButton) ' Activate button
End Sub

Sub InitOnPlay()
  Script.RegisterEvent SDB, "OnPlay", "OnPlay"
End Sub

Sub InitTimer()
  Set PauseBeforeTimer = SDB.CreateTimer(1000)
  PauseBeforeTimer.Enabled = False
  Script.RegisterEvent PauseBeforeTimer, "OnTimer", "OnPauseBeforeTimer"
End Sub

'======================================================================

Sub OnPauseBeforeButtonClick(Button)
  Button.Checked = not Button.Checked
  PauseBeforeOn = Button.Checked
End Sub

Sub OnPlay()
  If PauseBeforeOn Then
    If FirstSongStarted Then
      SDB.Player.Pause
      Set PauseBeforeProgress = SDB.Progress
      PauseBeforeProgress.MaxValue = PauseBeforeSeconds
      PauseBeforeProgress.Text="Pause " & PauseBeforeSeconds & " seconds."
      PauseBeforeTimer.Enabled = True
    End If
  End If
  FirstSongStarted = True
End Sub

Sub OnPauseBeforeTimer(Timer)
  PauseBeforeProgress.Increase
  PauseBeforeProgress.Text="Pause " & PauseBeforeSeconds - PauseBeforeProgress.Value & " seconds."
  If PauseBeforeProgress.Value >= PauseBeforeProgress.MaxValue Then
    If SDB.Player.isPaused Then
      SDB.Player.Pause ' Start player again
    End If
    PauseBeforeTimer.Enabled = False
    Set PauseBeforeProgress = Nothing
  End If
End Sub
Soren Werk
Posts: 29
Joined: Sat Jan 12, 2008 1:24 pm
Location: Denmark
Contact:

Same Script - New Name - New Method

Post by Soren Werk »

Same Script - New Method - New Name

I am using Player.Stop now, instead of Player.Pause, because I have discovered that Player.Stop does not cut off a little bit of the prior song and play it after the gap, the way Player.Pause does. This is good! I also found out how to turn off the progress indicator when the user starts the next song manually (by pressing (>) during the gap). This is also good! The only thing I am missing now, is a way to suppress the gap when I manually start a new song or set of songs.

Any suggestions anyone?
Is there any way to detect changes to the next song of the now playing list?

I changed the name of the script, because the old name reflects the old method used to create the gap. I like the new name better.

Code: Select all

'======================================================================
' MediaMonkey\Scripts\Auto\Gap.vbs
'
' Creates a gap between each song.
' Can be turned on and off with a button on the toolbar.
'
' 2008-02-02 - Soren Werk - www.tangoman.dk
'
' ToDo:
'   Defaults configurable in Options.
'   No gap when manual start of new song or set of songs.
'   Gap after "this" song instead of before next.
'======================================================================

Option Explicit

Const GapSeconds = 15
Const GapDefaultOn = True

Dim GapButton
Dim GapProgress
Dim GapTimer
Dim FirstSong : FirstSong = True
Dim AfterGap : AfterGap = False

Sub OnStartUp()
  InitButton
  InitPlayer
  InitTimer
End Sub

Sub InitButton()
  Set GapButton = SDB.UI.AddMenuItem(SDB.UI.Menu_TBStandard,0,0)
  GapButton.IconIndex = 2
  GapButton.Caption = "Turn " & GapSeconds & " seconds gap on and off"
  Script.RegisterEvent GapButton, "OnClick", "GapButtonOnClick"
  If GapDefaultOn Then
    GapButtonOnClick(GapButton)
  End If
End Sub

Sub InitPlayer()
  Script.RegisterEvent SDB, "OnPlay", "PlayerOnPlay"
'  Script.RegisterEvent SDB, "WhichEvent??", "SetFirstSong"
End Sub

Sub InitTimer()
  Set GapTimer = SDB.CreateTimer(1000)
  GapTimer.Enabled = False
  Script.RegisterEvent GapTimer, "OnTimer", "GapOnTimer"
End Sub

'======================================================================

Sub GapButtonOnClick(Button)
  Button.Checked = not Button.Checked
End Sub

Sub PlayerOnPlay()
  GapTimer.Enabled = False
  Set GapProgress = Nothing
  If GapButton.Checked and not FirstSong and not AfterGap Then
    SDB.Player.Stop
    AfterGap = True
    Set GapProgress = SDB.Progress
    GapProgress.MaxValue = GapSeconds
    GapProgress.Text="Gap " & GapSeconds & " seconds."
    GapTimer.Enabled = True
  Else
    AfterGap = False
  End If
  FirstSong = False
End Sub

Sub SetFirstSong()
  FirstSong = True
End Sub

Sub GapOnTimer(Timer)
  GapProgress.Increase
  GapProgress.Text="Gap " & GapSeconds - GapProgress.Value & " seconds."
  If GapProgress.Value >= GapProgress.MaxValue Then
    If not SDB.Player.isPlaying Then
      SDB.Player.Play
    End If
    GapTimer.Enabled = False
    Set GapProgress = Nothing
  End If
End Sub
Last edited by Soren Werk on Tue Aug 19, 2008 2:48 am, edited 1 time in total.
Guest

Post by Guest »

Thanks for this script. Let us know if you come up with the features you're looking for. Incidentally I'm starting to have the problem you described--MM cuts off a little bit of the prior song and play it after the gap. This is happening even though I'm using your latest script, which uses Player.Stop rather than Player.Pause.
rovingcowboy
Posts: 14163
Joined: Sat Oct 25, 2003 7:57 am
Location: (Texas)
Contact:

Post by rovingcowboy »

Anonymous wrote:Thanks for this script. Let us know if you come up with the features you're looking for. Incidentally I'm starting to have the problem you described--MM cuts off a little bit of the prior song and play it after the gap. This is happening even though I'm using your latest script, which uses Player.Stop rather than Player.Pause.
try going in to the plugin controls for the output plugin, and set the buffer or the crossfade to a different amount. or turn off remove silent space from the song. then if it does cut some of the song off it will only cut off the silent space. 8)



:)
roving cowboy / keith hall. My skins http://www.mediamonkey.com/forum/viewto ... =9&t=16724 for some help check on Monkey's helpful messages at http://www.mediamonkey.com/forum/viewto ... 4008#44008 MY SYSTEMS.1.Jukebox WinXp pro sp 3 version 3.5 gigabyte mb. 281 GHz amd athlon x2 240 built by me.) 2.WinXP pro sp3, vers 2.5.5 and vers 3.5 backup storage, shuttle 32a mb,734 MHz amd athlon put together by me.) 3.Dell demension, winxp pro sp3, mm3.5 spare jukebox.) 4.WinXp pro sp3, vers 3.5, dad's computer bought from computer store. )5. Samsung Galaxy A51 5G Android ) 6. amd a8-5600 apu 3.60ghz mm version 4 windows 7 pro bought from computer store.
Guest

Post by Guest »

Thanks. I didn't see a buffer option in the output plugin that I was using (although I did see buffer options in the second output plugin, which was deselected).
I turned off "remove space between tracks" and that seems to have resolved my issue.
Post Reply