SlowPlay - A simple audio player with speed/pitch change capabilities

Hello everyone, for those who are on Linux I just wanted to let them know about this little piece of software I wrote.

Like I said on the post title, it is a simple audio player based on gstreamer that can change playback speed and pitch “on the fly”. I mostly use it as my music class companion. It is nothing fancy, but it does the job!

Please give it a try and tell me what you think, any comments appreciated. Have a look at the keyboard shortcuts if you want to make the most of it. Installation is pretty simple, just download and unpack the latest release on your system, and launch the slowplay executable file.

9 Likes

That was so nice to install and try out. Good work!!!

1 Like

Thank you! I’m happy that it was easy to set up. Let me know your thoughts.

I installed, easily loaded an MP3, then quickly was able to navigate the interface. So far, I am quite impressed! I like that it works easily and intuitively - no complications to get in the way.

Thanks! Seems to work well, except for one minor GUI issue. I use KDE Plasma in Debian Bookworm with 150% global scaling for a UHD monitor and the speed indicator seems to cut off the last 0 showing 10% when it should be 100%.

Have you compared it to StretchPlayer — Audio player with time stretch and pitch shift (most GNU/Linux distros package it)?

It’s a native app (not using a gstreamer pipeline). One downside is that stretchplayer requires JACK, but with pipewire available on many systems that’s not an issue.

I’ve a similar project,

aloop is a audio file looper for Linux using PortAudio as backend (jack, pulse, alsa), libsndfile to load sound files and zita-resampler to resample the files when needed. For varispeed, fine tuning and pitch shifting it use librubberband. The GUI is created with libxputty.

Wow! Looks like I’ve reinvented the wheel! :rofl:

Well, anyway, I guess it’s better to have multiple tools to fulfill different needs, isn’t it?

1 Like

Hey @sunrat thank you for reporting this. I tried it on KDE Plasma and apparently it worked, but it was on a standard monitor, not UHD.

Looking at your screenshot It seems related to a coustomtkinter padding problem.
I’ll try to investigate.

1 Like

There’s also Play It Slowly :slight_smile:

Unfotunately Play It Slowly is no longer mantained and it doesn’t work on modern OS versions.

If you look at the story behind my software, you will see that it was born just because I couldn’t use Play It Slowly after switching to a new version of Linux Mint.

So yes, that wheel was to be reinvented! :slight_smile:

Aha I missed that part.

Another one I’ve used is Melissa, it’s scope is a lot larger than your project though (I like the simplicity of yours) and it doesn’t seem to be getting any updates.

@x42 just out of curiosity, is there any reason why relying on gstrramer is considered not convenient? Ok, maybe it’s a little bit of overkill since my app just handles audio, but I can’t see any drawback.

Let me know your thoughts.

Hey @sunrat I’ve been doing some tests and research. Apparently customtkinter (the graphic framework used by SlowPlay) doesn’t get along with display scaling.

I’ve seen there are other users having the same issue, but I couldn’t find a solution yet. To be honest, I have not much time these days so I couldn’t really deep dive into the problem, but I will try to work it out in the next weeks.

My go-to choice for several years has been TimeStretch Audio Player - 29a.ch, in the browser and as good as high fidelity as any I’ve heard.

1 Like

OK thanks for looking. I don’t use that kind of functionality often but am always curious to check out new software. Hope you can sort it out. I think a lot of people are using hi-res screens with display scaling these days.

1 Like

I love how somebody posts something pretty cool they made themselves as a layman and gets recommended to use several other apps… :upside_down_face:

If @aFunkyBass posted another one of his great band songs here would you recommend other songs for him to listen to instead of just listening to his song…? I find this thread kind of weird and impolite…

Congrats on taking the time, effort and ingenuity to solve your issue by rolling up your sleeves and making your own cool app, I think that’s pretty awesome!

8 Likes

I didn’t see what you see. None here recommended to use a other app. Only pointed out that there are other projects doing similar stuff which may be considered as source to help.
From a developers point of view I love to read source code of several projects which working on the same stuff then I do currently. It may bring me some inspiration or help me to solve issues better by getting a better understanding how things work.

3 Likes

Hi Robin. After reading this, I installed stretchplayer on my laptop. But it wont start.
When trying to start it from the terminal I get this message:

stretchplayer
QSocketNotifier: Can only be used with threads started with QThread
StretchPlayer version 0.503, Copyright 2010 Gabriel M. Beddingfield
StretchPlayer comes with ABSOLUTELY NO WARRANTY;
This is free software, and you are welcome to redistribute it
under terms of the GNU Public License (ver. 2 or later)

Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jackdmp 1.9.22
Copyright 2001-2005 Paul Davis and others.
Copyright 2004-2016 Grame.
Copyright 2016-2023 Filipe Coelho.
jackdmp comes with ABSOLUTELY NO WARRANTY
This is free software, and you are welcome to redistribute it
under certain conditions; see the file COPYING for details
jack_get_descriptor : dll
jack_get_descriptor returns null for ‘jack_inprocess.so’
Cannot create RT messagebuffer thread: Operation not permitted (1)
Retrying messagebuffer thread without RT scheduling
Messagebuffer not realtime; consider enabling RT scheduling for user
no message buffer overruns
Cannot create RT messagebuffer thread: Operation not permitted (1)
Retrying messagebuffer thread without RT scheduling
Messagebuffer not realtime; consider enabling RT scheduling for user
no message buffer overruns
jack_get_descriptor : dll
jack_get_descriptor returns null for ‘jack_internal_metro.so’
jack_get_descriptor : dll
jack_get_descriptor returns null for ‘jack_intime.so’
Cannot create RT messagebuffer thread: Operation not permitted (1)
Retrying messagebuffer thread without RT scheduling
Messagebuffer not realtime; consider enabling RT scheduling for user
no message buffer overruns
JACK server starting in realtime mode with priority 10
self-connect-mode is “Don’t restrict self connect requests”
audio_reservation_init
Acquire audio card Audio0
creating alsa driver … hw:0|hw:0|1024|2|48000|0|0|nomon|swmeter|-|32bit
ALSA: Cannot open PCM device alsa_pcm for playback. Falling back to capture-only mode
JackTemporaryException : now quits…
Released audio card Audio0
audio_reservation_finish
Cannot initialize driver
JackServer::Open failed with -1
Failed to open server
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
Cannot connect to server socket err = No such file or directory
Cannot connect to server request channel
jack server is not running or cannot be started
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
JackShmReadWritePtr::~JackShmReadWritePtr - Init not done for -1, skipping unlock
stretchplayer: ./src/JackAudioSystem.cpp:105: virtual int StretchPlayer::JackAudioSystem::set_process_callback(StretchPlayer::AudioSystem::process_callback_t, void*, QString*): Assertion `_client’ failed.
Aborted

Please can you explain what it means and if there is a way to fix it
Many thanks

It appears you do not have jackd configured properly. Try configuring and starting jackd first to make sure it is running correctly before starting (or make sure that you have pipewire-jack running if you wish to use the pipewire JACK server in place of jackd).