
Cmd.fm - peacewise
http://cmd.fm/
======
JoshTriplett
Interesting concept, but it's always surprising to see a newly created web-
based audio player that expects Flash rather than using HTML5 audio. Doesn't
work at all without Flash.

~~~
gisenberg
Is it, though? The state of HTML5 audio is still pretty atrocious.

~~~
JoshTriplett
Apart from the selection of codecs, HTML5 audio seems to have pretty much all
the bases covered.

As for codecs, depending on your application, you can either pre-transcode all
your audio to an appropriate codec, transcode on the fly, or even use a
Javascript transcoder and the Audio Data API.

~~~
gisenberg
I just came from a project that required heavy use of HTML5 audio, and let me
tell you that the 15+ ffmpeg calls during the audio build step were the least
painful part of the process.

HTML5 audio in iOS is a bit of a black box, with variable, unpredictable and
undocumented behaviors between iOS5 through 7. These guards are intended to
shield users from obnoxious behavior, but in the process, make the feature
useless for everyone else.

You get one HTML audio element whitelisted in response to a user-initiated
event, so you need a "click anywhere to do something useful!" screen. Also,
you've got that one element to work with, so something like sound effects with
a background track is out of the question.

Once you've got a whitelisted element, you can then re-use that element to
play individual sounds by swapping out the src attribute of that single
whitelisted audio tag, which queues a new web request and plays back the sound
whenever the web request finishes... which is usually several seconds after
you wanted it to play.

This happens regardless of whether or not the sound has been played before;
the result isn't cached locally.

So, if you want to produce something remotely workable, you do audio spriting
and never switch out to a different audio file. You create a build step that
pulls in all of your audio, all of your sound files, puts them together into a
single wave file, generates an audio atlas, and re-encodes audio to mp3, wav
and ogg to hit all the major players (rinse and repeat for other channels of
audio). Which works on most devices, but iPads decide to ignore currentTime
assignments on that audio track, so the whole thing is kind of botched.

That's before we try to get stuff predictably working in IE, which can go
anywhere from screwing the whole thing up to unpredictably mutating volume
levels. That's before we support Firefox, which doesn't loop audio like
everything else does and randomly stops playing audio. That's before we
support Android, which exhibits different behaviors across the stock browser
and Chrome, and so on, and so on.

If you want to play a single audio track in one or two desktop browsers, then
sure, the technology is somewhat ready for you. Codecs are the least painful
part of the problem. Anything beyond that is a travesty.

~~~
itsboring
My experience matches this. For a serious project, it is a clusterfuck of
dogshit proportions.

~~~
ezequiel-garzon
"a clusterfuck of dogshit proportions"

I thought it might be a standard expression in some literary circles, but
according to Google it turns out to be original poetry!

------
whichdan
Very cool app. Few thoughts:

\- If a track doesn't start buffering quickly enough, maybe automatically skip
it?

\- Running 'clear' also clears the current track, but it should really be
persistent.

\- This might go against the popular opinion, but I'd like to see "now
playing" pinned at the top, so when the window scrolls, it scrolls under it,
instead of effectively hiding it.

\- Consider setting a cookie to track preferences.

\- If you could link to the source (the current song's soundcloud link) that
would be excellent. At the very least, a permalink or something.

~~~
bnegreve
Point 2, 3 and 4 are nice, but wouldn't really fit in the command line
interface, which is the main feature of the website, I think.

~~~
whichdan
I agree in theory, but I think that breaking the mold slightly will help it
grow past a cool tech demo.

I'm mainly comparing this against using SoundCloud directly, or something like
turntable.fm. A big feature I like is being able to +favorite a song that I
like, or buy the album, so anything that causes me to lose context greatly
devalues the app.

And for the cookies, it's really just the background and comment preferences.
Maybe the cookie could be named .cmdfmrc or something?

------
ChrisNorstrom
I noticed it requires flash.

If not already, you should use Sound Manager 2
[http://www.schillmania.com/projects/soundmanager2/](http://www.schillmania.com/projects/soundmanager2/)
and its api. It's amazing. It auto selects HTML5 or Flash on both pc and
smartphones. It even checks if people have flashblock enabled and tells them
to "click here to enable flash".

I've used it on 2 projects before
[http://timeforzen.com](http://timeforzen.com) and
[http://residentevilradio.com](http://residentevilradio.com) (it can also
stream from shoutcast servers.) I've got HTML5 disabled on those 2 projects
because it was still beta and glitchy at the time the feature was introduced.

------
lelandbatey
Oddly, I can play most stuff, but not drum & Bass. It just says

    
    
        Searching genre..
        Found! Playing 'Drum & Bass' genre, yay!
    
    
        -----------------------------------------------------------------
    
        The song is ended (but the melody lingers on)
    
        -----------------------------------------------------------------
    
    
        Welcome to cmd.fm!
    
        Use 'help' command to see available commands
        >
    
    

It's rather odd...

~~~
davedx
Hah, I looked for dnb first but missed it in the list due to the columns
format, so I started with grime instead.

I wonder if it's due to the ampersand.

~~~
DarkStar851
Seems to be. Piping straight to the backend works just fine for Drum & Bass if
you URL Encode.

------
gbog
I also prefer TUI over Ajax GUI but here I think we don't have the tools and
environment that define a real TUI. For example, can I pipe the genre list to
grep or sort or awk? Can I script a player in a cronjob? I doubt it (cannot
check because on a phone)

~~~
pearjuice
TUI, seriously? It's been called CLI for years.

~~~
gioele
CLI is for dealing with an application or system through its command line:
"apt-get install foo"

TUI are usually curses-based interfaces that live in the terminal and have
menu, windows and sometime support for interacting with them with the mouse
(for example aptitude or alsa-mixer).

------
ineedtosleep
If you're like me and escape your spaces instinctively (e.g. "Progressive\
Rock" instead of "Progressive Rock"), it won't work. Hold back the desire to
press the "\" key.

~~~
whichdan
A little formatting magic in the background would be great. For instance
"progressive rock" and "triphop" work, but "progressiverock" "prog rock" and
"trip hop" don't.

~~~
hkdobrev
Removing all whitespace, converting everything to lowercase and removing
special chars should to the job. I hope they build it in.

------
_lex
You should actually constrain volume to 1-100. I'm currently listening at
2000, and I tried 1000000 and it was painful.

------
tjbarbour
For some reason, can't see how to comment, am I missing something?

~~~
chrislloyd
Comments are taken from SoundCloud. They're not realtime from other listeners.

~~~
m33p
Thank you, I was quite confused. Thought this might have just been a neat
shell for another streaming radio of some sort.

------
hsmyers
Long ago, there was music, call it pop. Much time passes and the same music is
still played, but it has been renamed folk. Edison, got involved and the guy
on the Martin discovered Fender so now they call it folk rock. Just to be
clear, folk didn't go away, it is still around and thriving---fix your genres
please :)

------
jaytaylor
Doesn't work at all with the "Vimium" Chrome extension [1]. What a shame.

[1]
[https://chrome.google.com/webstore/detail/vimium/dbepggeogba...](https://chrome.google.com/webstore/detail/vimium/dbepggeogbaibhgnhhndojpepiihcmeb?hl=en)

~~~
jzelinskie
Sure it does. Just press i to enter insert mode. You have to do this for a
couple of things to work (ie direct links to .swfs). It sucks to do, but I'm
not going to give up Vimium to avoid having to enter insert mode every now and
then.

------
asimov42
Love the nowhere layout! Is it possible to go to the previous track? Sometimes
you get a song really stuck in your head and its nice to play it on repeat for
a while while you work on something.

~~~
muxxa
Also, usually the exact moment when I want to look up the name of a track that
I like is when it just finishes playing. This is also the exact time when this
interface removes the name of the track and replaces it with the new 'now
playing' song. Please keep a record of all songs played in the scrollback!

------
ams6110
Would love to see this expand. More general soundcloud search, etc. I played
the "Funk" genre and it started repeating after only a few tracks. Nice demo
of the concept though.

------
radley
Funny, you can tell by which generation/culture a player was made based on the
listed genres. In this case I see acid jazz, trip-hop, and moombahton but no
dubstep or glitch hop.

~~~
shitlord
I'm playing Electro House right now. There's also Electronic, House, and
Techno. You can't really judge them for not bothering to list _every_
subcategory.

~~~
radley
Not saying they must list every one. Rather it's always interesting / fun too
see to see when someone releases a player w/ genres which ones they'll offer.

------
anuragramdasan
This is lovely. Although it would be great of there could be some link or info
about the track being played because this could work as a brilliant music
discovery service.

------
blueblob
Kind of cool, but doesn't allow much customization of the music. I'll stick
with my terminal and pianobar for now.

------
bmslieght
Current volume is 100, enter value between 0 and 100 > 100 [USER]: Cannot call
method 'setVolume' of undefined [[;#f00;;;TypeError: Cannot call method
'setVolume' of undefined at playerVolume
([http://cmd.fm/js/common.js:26:15](http://cmd.fm/js/common.js:26:15)) at
setVol
([http://cmd.fm/js/terminal.js:182:3](http://cmd.fm/js/terminal.js:182:3)) at
Object.term.push.prompt [as eval]
([http://cmd.fm/js/terminal.js:358:11](http://cmd.fm/js/terminal.js:358:11))
at Object.z [as commands]
([http://cmd.fm/js/terminal/jquery.terminal-0.5.4.min.js:70:18...](http://cmd.fm/js/terminal/jquery.terminal-0.5.4.min.js:70:186))
at HTMLHtmlElement.t
([http://cmd.fm/js/terminal/jquery.terminal-0.5.4.min.js:41:20...](http://cmd.fm/js/terminal/jquery.terminal-0.5.4.min.js:41:201))
at HTMLHtmlElement.x.event.dispatch
([http://cmd.fm/js/jquery.js:5:14129](http://cmd.fm/js/jquery.js:5:14129)) at
HTMLHtmlElement.v.handle
([http://cmd.fm/js/jquery.js:5:10866)]TypeError](http://cmd.fm/js/jquery.js:5:10866\)\]TypeError):
Cannot call method 'setVolume' of undefined at playerVolume
([http://cmd.fm/js/common.js:26:15](http://cmd.fm/js/common.js:26:15)) at
setVol
([http://cmd.fm/js/terminal.js:182:3](http://cmd.fm/js/terminal.js:182:3)) at
Object.term.push.prompt [as eval]
([http://cmd.fm/js/terminal.js:358:11](http://cmd.fm/js/terminal.js:358:11))
at Object.z [as commands]
([http://cmd.fm/js/terminal/jquery.terminal-0.5.4.min.js:70:18...](http://cmd.fm/js/terminal/jquery.terminal-0.5.4.min.js:70:186))
at HTMLHtmlElement.t
([http://cmd.fm/js/terminal/jquery.terminal-0.5.4.min.js:41:20...](http://cmd.fm/js/terminal/jquery.terminal-0.5.4.min.js:41:201))
at HTMLHtmlElement.x.event.dispatch
([http://cmd.fm/js/jquery.js:5:14129](http://cmd.fm/js/jquery.js:5:14129)) at
HTMLHtmlElement.v.handle
([http://cmd.fm/js/jquery.js:5:10866)](http://cmd.fm/js/jquery.js:5:10866\))]
Current volume is 100, enter value between 0 and 100 >

------
Stealth-
I prefer this sort of interface _any_ day compared to a bloated AJAX-y web
interface that kills my browser.

------
lcasela
This is really useful. It would kinda cool if you made this into a command
line app. Still, good job!

------
ldonley
This is certainly an interesting idea, definitely appeals to the
programmer/hacker type. Its not a service for everyone since it looks
complicated and scary to someone who has never opened a terminal before. I
think this is fun though and you did a good job!

------
adriancooney
This is absolutely fantastic! I'd love a native Alfred style Option + Space
interface so I could quickly chop and change between the music because having
to switch to Chrome then the right tab is cumbersome. This is really great
however, excellent job.

------
datashaman
Odd: When I play a genre, the site tries to POST to
[http://localhost/cmdfm/api/users/](http://localhost/cmdfm/api/users/), which
is denied by my local Apache since it does not exist.

Coding error?

------
_lex
How do we chat in the repl? I'm getting messages I'd like to engage with.

~~~
ivan_ah
I think these are the comments from soundcloud.

Though it would be really cool to have a chatroom for each song. My first
interpretation was the same as yours and I was wondering if there is a char
room per genre or one chatroom per song.

Amazingly useful app!

------
jeena
I wrote "play Jazz" and pressed enter then I see that it searches and finds
something but then it just stops at 0:00 minutes and does nothing. (Firefox 23
on OS X)

~~~
jeena
Oh interesting, after upgrading to Firefox 24 it started to play the music.

------
brownBananas
Good stuff! I personally don't have a use for it, but I think other's need to
see this.

If anyone is looking for a front-end job, look in the right place. Look in the
source.

------
blaireaug
Excellent! Bookmarked and will be listening, I've definitely needed something
like this for a while, and it's really a beautiful design to pull off.

------
pintglass
This would be even better if it were a real terminal command-line app for OS X
(and installable via brew) and Linux (and installable via apt).

------
djhworld
Can you download this as a standalone app? I'd love a command line music
player I can just boot into from my terminal

~~~
austinhyde
Check out pianobar, a command line Pandora client. It works great for me!

[http://6xq.net/projects/pianobar/](http://6xq.net/projects/pianobar/)

------
gcb0
ah. that made me sad. i thought it was a telnet or something emulator into the
actual service. But it's just a html/js shenanigans :(

I'd like the actual service to be a command line via telnet or other
established protocol, so i can automate it via cron, arduino buttons and what
not the cool kids use today.

~~~
seldo
How would you expect the audio to be delivered in a service you accessed via
telnet?

~~~
gcb0
no. I thought the service gave you a audio stream URL and then via telnet/etc
you could control what was dumped into that steam.

I thought the site was just a convenient way to demo it all together by
already opening the steam in an audio html tag or something and exposing the
console api on the same page.

~~~
debaserab2
Just curious - what would be desirable about an actual telnet service that
does this? You seem disappointed that it wasn't that, but I'm struggling to
understand the advantages.

~~~
gcb0
integration.

if you had telnet/rest or any other standardly documented access point, I
could schedule stations with a cron script. Have a hardware button with an
arduino. The sky is the limit.

The way it is now, it's just a toy. nothing other than a slightly more
inconvenience to use than pandora. it doesn't really add anything different.
Well i could emulate keystrokes and expose an API myself, but then i could
already do that emulating mouseclicks in pandora anyway.

------
fl0m
I hear nothing. I get some error when I'm trying to change volume. Where do
these great comments came from?

------
rashthedude
Wow, I'm in awe. I have seen a lot of wonderful mash-ups but this really
tickles my fancy. Great job.

------
gren
This is awesome! Nice idea, would be great to be able to search for a given
track by name / author.

------
ams6110
Doesn't work at all for me. Mac OSX 10.8.5, tried Firefox and Chrome.

Edit: the cli works, but no music.

~~~
citizenterminal
It wasn't working for me either. It turns out that that you need to have Flash
installed and enabled to run by default for the music to play.

~~~
ams6110
Strange. I went to chrome:plugins, checked Flash (was enabled) then went back
to cmd.fm and now it's working.

------
susi22
I'd love to get these implemented:

\- Ctrl + L

\- 'w'

\- 'ls'

------
jafaku
Oh nice. A black screen -.-

------
bender80
Very cool. I like the awake layout. Listening to some rock music now.

------
moe_
missing one thing for me, the Status page should also show in which Genre you
are currently, i cant see that anywhere

------
osipovas
I am enjoying this immensely. Thank You!

------
sparktree
awesome idea, unfortunately doesn't work with a mobile browser keyboard

------
oddshocks
This is so ill. Nice work.

------
devashish86
love it. Can you give an idea of what tech are you using for this.

------
thehodge
No country :(

------
jensenbox
Great idea!

------
hsinxh
absolutely brilliant.

------
jpinkerton88
this is the best

------
shire
this is so cool

------
rfnslyr
OMG I LOVE THIS. The Dream Pop playlist is awesome, thanks OP. I love
discovering new music!

