[HN Gopher] Show HN: Handel - A procedural programming language ...
       ___________________________________________________________________
        
       Show HN: Handel - A procedural programming language for writing
       songs in browser
        
       Author : ddj231
       Score  : 165 points
       Date   : 2021-01-05 02:45 UTC (20 hours ago)
        
 (HTM) web link (handel-pl.github.io)
 (TXT) w3m dump (handel-pl.github.io)
        
       | PaulDavisThe1st wrote:
       | I suspect that a lot of HN readers may not be aware that this is
       | just the latest example of DSL's used for "live coding" music.
       | 
       | There are others that have been around for a lot longer and have
       | incorporated many (all?) of the features you will start to long
       | for if you use this sort of tool a lot.
       | 
       | Live-coding is an insanely geeky way to make music, but there are
       | people out there doing quite interesting things with it. I use
       | "interesting" deliberately ... I haven't heard anything that I've
       | actually liked :)
        
       | letientai299 wrote:
       | I tinkered with it a bit and create this code[0] based on a
       | song[1] that I'm learning. I think this tool is cool and has
       | potential, but still need a lot more improvement. At least it
       | needs a way to reduce duplicate in my code :)
       | 
       | [0]: https://pastebin.com/9ziV0HRe
       | 
       | [1]: https://www.youtube.com/watch?v=3t9iLEkTeAk
        
         | ddj231 wrote:
         | Nice one!
         | 
         | I agree, it is still in its early stages.
         | 
         | Looking at your code it seems it would be useful to have a way
         | to repeat a play command without a chunk.
         | 
         | I think something like: " play E4 for 1b rep 5 "
         | 
         | As a way to repeat something 5 times for example (and reduce
         | duplicates) could be a future solution.
        
       | kliments wrote:
       | Functional and very simple to use, and looks clean to the eye.
       | Great job!
        
         | ddj231 wrote:
         | Thanks!
        
         | franci97 wrote:
         | Yeah! It seems a nice one, for real... I have many friends that
         | were searching for it, I'll spread the word for sure. Thank
         | you!
        
       | VitorVRS wrote:
       | A try to JoJo: start chunk introriff play G4, B4, E5 for 16b play
       | C5 for 4b play A#4 for 1b play C5 for 1b play A#4 for 1b play G4
       | for 5b play F#4 for 8b play A#4 for 12b play E3 for 12b play G4,
       | B4, E5 for 12b play C5 for 4b play A#4 for 1b play C5 for 1b play
       | A#4 for 1b play G4 for 5b play F#4 for 8b play B3 for 1b play C4
       | for 1b play D4 for 2b play F#3 for 1b play G3 for 1b play A3 for
       | 2b play C3 for 20b play E3 for 12b play G4, B4, E5 for 12b play
       | C5 for 4b play A#4 for 1b play C5 for 1b play A#4 for 2b play G4
       | for 5b play F#4 for 8b play A#4 for 16b play F#4 for 28b play G3,
       | F#4 for 4b play G4 for 1b play G4 for 1b play F#4 for 1b play E4
       | for 1b play D4 for 1b play C3, E4 for 2b play D4 for 2b play C4
       | for 2b play B3 for 2b play B2, D4 for 2b play B3 for 2b play A2,
       | C4 for 2b play A3 for 2b play G2, B3 for 2b play G3 for 2b play
       | F#2, A3 for 2b play B2, E3, G3, B3, E4 for 6b play C#2, F#3, A3,
       | B3, E4 for 2b rest for 2b play D2, G3, B3, B3, E4 for 2b rest for
       | 2b play C#2, F#3, A3, B3, E4 for 2b rest for 2b play D2, G3, B3,
       | B3, E4 for 2b rest for 2b play C#2, F#3, A3, B3, E4 for 2b play
       | B2, E3, G3, B3, E4 for 8b endchunk run introriff with bpm 510,
       | sound piano finish
        
       | SamBam wrote:
       | This looks wonderful.
       | 
       | I may be missing it from the description, but when I think
       | "procedural" I think that I should be able to change the
       | variables with math, or at the very least increment variables.
       | Are there any examples of that?
       | 
       | For example, I would think I could play a scale with something
       | like                   save myPlayable = C1 for 1b         do
       | play myPlayable           myPlayable.note++         while
       | (myPlayable.note < C2)
        
         | ddj231 wrote:
         | Thanks!
         | 
         | So by procedural what is meant is that the there are chunks
         | (which are Handel's procedures/functions).
         | 
         | Currently your code snippet can't be replicated in Handel.
         | Looping is accomplished by telling a chunk to loop (giving it a
         | number of times to loop). ex. run somechunk with loop for 100
         | 
         | But there is no arithmetic in the language. Adding arithmetic
         | to playables like you mentioned could be a nice feature
        
           | SamBam wrote:
           | Thinking a little more, I guess I would actually expect it to
           | look a bit more like                   save myNote as C1
           | save myPlayable = myNote for 1b         do           play
           | myPlayable           save myNote as myNote + 1         while
           | (myNote < C2)
           | 
           | (That is, the dot notation looked out of place given your
           | language.)
        
       | preya2k wrote:
       | Just FYI: Handel translates to ,,Trade" in German. I think you
       | picked it to refer to the composer ,,Handel", right? Anyway I
       | expected something different after reading the name ;)
        
         | rusk wrote:
         | In English he is known as Handel. At least in Dublin anyway
         | where he first performed his _Messiah_ so it is somewhat
         | canonical ...
         | 
         | Also apparently a naturalised British citizen without the
         | umlaut [0]
         | 
         | EDIT check out his signature on [0] no umlaut so he was
         | _Handel_ even to himself!
         | 
         | [0] https://en.m.wikipedia.org/wiki/Messiah_(Handel)
        
         | adflux wrote:
         | Ever tried putting an umlaut in a URL?
        
           | numlock86 wrote:
           | Yes, I do that regularly and it works as one would expect.
           | What are you trying to bring up?
        
             | mmmateo wrote:
             | Well most of the planet wouldn't know how if you paid them
             | to
        
           | layer8 wrote:
           | RFC 3987 never really caught on.
           | 
           | See also https://www.w3.org/International/wiki/IRIStatus
        
           | [deleted]
        
         | dagw wrote:
         | For what its worth, Handel means "trade" in Swedish as well,
         | but I instantly thought of the composer when I saw the name.
        
       | andreskytt wrote:
       | Being able to set a key or mode would be nice. Play verse but 3
       | semitones up. Play melody A but in phrygian. Would be nice to
       | experiment with different moods
        
       | city41 wrote:
       | This is really cool. I like domain languages like this a lot. I
       | basically hand rolled a very primitive version of this for a game
       | I made. I wonder if game devs in general would find it useful for
       | prototyping, game jams, etc.
       | 
       | Just FYI to the author, the code samples have dead scrollbars,
       | due to pre elements having overflow: scroll set
       | 
       | https://i.imgur.com/2LWhKWj.png
        
         | ddj231 wrote:
         | That's an interesting use case -- though the
         | language/interpreter is still in its early stages.
         | 
         | And nice catch on the scroll bars, will fix, thanks!
        
       | arcsincosin wrote:
       | I'm having a hard time getting instruments to synchronize in the
       | examples--over time all the sequences drift. Is this expected /
       | known?
        
         | ddj231 wrote:
         | It isn't expected. But I have noticed the issue as well, and
         | I'm looking to fix. I think it may have to do with how note
         | lengths from beats are being calculated.
         | 
         | The Handel interpreter uses Tone.js for scheduling and playing
         | notes. But because there is only one Tone.Transport per page,
         | changing the bpm of the Transport would change it for all
         | tracks.
         | 
         | So instead of using Tone.js for setting bpms, the note lengths
         | are calculated based on the bpm and amount of beats, and
         | scheduled in seconds. Which could lead to greater imprecision
         | over time
        
       | sam_goody wrote:
       | How des this compare to Lilypond (aside for being browser based)?
        
       | jacquesm wrote:
       | Nice. Have you found any good workarounds for getting midi to
       | work in Firefox or is this Chrome only?
        
         | adamjb wrote:
         | It works in my firefox
        
           | capableweb wrote:
           | Well, you're both slightly off. No, midi does not work in
           | Firefox, last time I checked, Mozilla still doesn't like the
           | security of the current API hence it hasn't been implemented.
           | 
           | And no, the website is not using midi at all. Midi is a
           | protocol for sending notes between devices, but there is
           | neither any notes to be sent nor any connections to other
           | devices, this is all local. My guess would be that Handel is
           | using the various Audio APIs only.
        
       | fab1an wrote:
       | This reminds me of the very fun and oldschool tracker paradigm
       | for music production. Incidentally, this is experiencing a bit of
       | a renaissance due to the wonderful Polyend Tracker hardware - I
       | also recommend Renoise / Redux, which is probably the most
       | powerful tracker available right now.
        
       | jkingsbery wrote:
       | Looks interesting. I had spent a while playing around with
       | LilyPond (http://lilypond.org/), and I think something like
       | Handel would solve issues with some of the more repetitive parts
       | of using LilyPond.
       | 
       | One thing that would be helpful that I didn't see would be able
       | to write transformations of chunks. For a few examples: (1)
       | taking a chunk and replaying it in a different scale (or with a
       | different starting note), (2) having the end of a chunk resolve
       | to the tonic up an octave, (3) inverting or chunking chords
       | following common patterns.
       | 
       | It would also be great if instead of just outputting midi, it
       | could also output either to engraved music, or to some other
       | format (e.g., LilyPond) that someone could then use to create a
       | PDF.
        
         | PaulDavisThe1st wrote:
         | Lilypond was created for _engraving_ music (aka  "sheet
         | music"). Handel has essentially nothing to do with that at all.
         | Handel is a compositional "tool", Lilypond is a music
         | typesetter. There are all kinds of tools for composing/writing
         | music; Lilypond is essentially a backend for such applications
         | to allow them to generate beautiful sheet music.
        
       | yatakaka wrote:
       | Would be great if this could interface with Max, pure data,
       | supercollider or some synthesis language.
        
       | eecks wrote:
       | Looks intriguing but is there no examples of a song or tune fully
       | written?
        
         | ddj231 wrote:
         | There are no recreations of songs fully written as of yet (but
         | I do think that is a good idea and something to add to the
         | examples folder).
         | 
         | For now there are a couple examples in the examples folder
         | here: https://github.com/ddj231/Handel/tree/master/Examples
         | 
         | that demo the current core language features.
        
       | ddj231 wrote:
       | I started building Handel some weeks ago, as a simple way of
       | writing music with code. While the livecoding movement focuses on
       | providing solutions for performing music live with code, and
       | making changes on the fly -- I focused on simple song writing
       | (one reason why I wouldn't consider Handel an esoteric language).
       | 
       | One notable aspect of Handel is the behavior of its procedures,
       | which are called chunks. Each chunk is conceptually a song track
       | and all run chunks (from procedure calls) play at the same time.
       | A run of a chunk can be customized by passing in arguments (ex.
       | chords to use). The bpm, instrument, and loop amount of a run of
       | a chunk can also be optionally set to further customize that run.
       | 
       | Open to questions and feedback!
        
         | PaulDavisThe1st wrote:
         | Is there a reason you decided to start from scratch with this
         | DSL rather than implement one of the many other live coding
         | DSLs on top of Tone.js ? Some specific vision of the end point,
         | or just a desire to start from the beginning?
        
         | johnx123-up wrote:
         | How is this different (or better than) from ABC notation?
        
           | ddj231 wrote:
           | I think in 2 ways:
           | 
           | 1. Readability:
           | 
           | Ex.
           | 
           | start
           | 
           | play E3, Ab3 for 1b
           | 
           | rest 5b
           | 
           | play E3, Ab3 for 1b
           | 
           | finish
           | 
           | It is somewhat intuitive to read the above without experience
           | with the language (or with programming in general).
           | 
           | 2. Procedures: You can create chunks (procedures), which are
           | reusable. For example you can create a chunk which takes 3
           | chord playables as parameters and run that chunk with any
           | arguments. And also stack those runs on top of each other
           | (because all run chunks play at the same time).
        
         | fergonco wrote:
         | Hi! I built something similar:
         | https://fergonco.org/MusicJargon/. I think you will find it
         | interesting. It compiles to midi, though. Your browser support
         | is quite a feature, indeed.
         | 
         | Had long discussions with my brother (the family musician) on
         | how to encode chords. At some point I even used the actual UTF
         | characters for sharp and bemol and was a total nightmare to
         | write :D
         | 
         | My effort is mostly abandoned (I switched to teach my kids to
         | actually play!). Courage!
        
           | ddj231 wrote:
           | Hi! Compiling to midi is also a great feature. I think having
           | both the immediate feedback of hearing your compositions, and
           | the ability to export to midi would be useful
        
         | stelonix wrote:
         | Am very interested! By looking at it on a glance, I'm wanting
         | to write a mscx (Musescore) importer. I have a question though,
         | that may have skipped my eyes: is there a way of setting a
         | note's duration to less than a beat?
        
         | p2detar wrote:
         | Looks great on the first glance! I'll inspect it in detail
         | tonight.
         | 
         | I'm looking for something that helps my get back into chip-
         | tunes composing. I used to be an ImpulseTracker junkie in the
         | past.
        
           | stelonix wrote:
           | Got any songs to share? It's the kind of music I listen to
           | most of the time, specially while coding/working on my
           | projetcs!
        
         | tartoran wrote:
         | I suggest you add a drop down with some composition examples in
         | the editor so it kind of demos out what it is capable of. The
         | language feels quite natural to transfer an existing score or
         | to compose something out so it could fill out some niche. I'm
         | not a trained musician so take this as an opinion.
        
           | ddj231 wrote:
           | There's an examples folder here linked to from the
           | documentation but having examples in editor would be
           | intuitive as well. (here's the link to the folder if you were
           | curious:
           | https://github.com/ddj231/Handel/tree/master/Examples)
           | 
           | The editor is pretty barebones at the moment
        
         | undecisive wrote:
         | Definitely cool! I do like simple text-based music tools, and
         | the fact that it has a live web player is excellent.
         | 
         | A couple of things I noted:
         | 
         | - I couldn't work out how to run two chunks in sequence - I'm
         | presuming the language doesn't support it yet, since none of
         | the examples do it either?
         | 
         | - It would be nice if the "play" keyword accepted the "loop"
         | syntax too (or something similar)
         | 
         | - On the web editor, despite the song reaching the finish, you
         | have to press stop before you can press play again. It's a
         | little thing, but I spent an embarrassingly long amount of time
         | thinking it was just a firefox bug, copying my song to
         | clipboard, refreshing the page and pasting it back in!
         | 
         | That said, have enjoyed playing with it. Any future plans?
        
         | ArtWomb wrote:
         | Syntax is very human readable, yet still expressive.
         | 
         | In terms of extending, is there an easy interface for
         | generating custom waveforms? Or alternatively, if I generate
         | sine oscillator raw data just using javascript math functions,
         | can I mix the resulting waveform into a Handel chuck that's
         | already running?
         | 
         | My first though was that this would make a great basis for
         | Visual Coding! Great Work ;)
        
         | mcphage wrote:
         | How do you run two runnables at the same time? Like, chords for
         | the left hand, and then the melody for the right?
        
           | ddj231 wrote:
           | On a basic level the program below would accomplish that
           | (can't promise this sounds pleasing to the ear ;) -
           | 
           | start
           | 
           | chunk lefthand
           | 
           | play C3, Eb3, G3 for 2b
           | 
           | rest for 2b
           | 
           | endchunk
           | 
           | chunk righthand
           | 
           | play C3 for 1b
           | 
           | play Gb3 for 1b
           | 
           | play Eb3 for 1b
           | 
           | play Db3 for 1b
           | 
           | endchunk
           | 
           | run lefthand with loop for 100
           | 
           | run righthand with loop for 100
           | 
           | finish
        
             | mcphage wrote:
             | Which part of "run lefthand with loop for 100" makes it
             | non-blocking? It it "run" instead of "play"?
        
               | ddj231 wrote:
               | Currently all run chunks play at the same time. So 'run
               | somechunk' will create a run of a chunk that begins at
               | the same time as all other run chunks.
               | 
               | Your question does bring up an interesting idea, which
               | would be to have a 'play somechunk' command that is
               | blocking. But that does not exist at the moment
        
       | gegtik wrote:
       | reminds me of sonicpi
        
         | simonvc wrote:
         | Sonic PI on the web, with repl.it like forking/remix would be
         | really something.
        
       ___________________________________________________________________
       (page generated 2021-01-05 23:02 UTC)