Soul.dev - live-code SOUL in your browser!

#1

Exciting news for those people who’ve been following our progress with SOUL - you can now actually try writing it yourself… in your browser!

The website is https://soul.dev, where we’ve built a WASM/WebAudio based playground where you can write and interact with simple SOUL programs. The playground supports audio in & out, WebMIDI, and can expose properties as event-sources so you can write synths, effects, etc. with live properties.

We’ve got a folder of example code here:
https://soul.dev/examples

(the list of examples is hosted in our github repo: https://github.com/soul-lang/SOUL/tree/master/examples, so if you write something great and would like us to add it as an example, please let us know!)

This is still very early in the SOUL project, and the playground only represents the first step of many products and a much more fully-featured API that we’re aiming to have ready later this year, but it’s fun to tinker with, and we’d love to hear your feedback on the language itself.

21 Likes
pinned #2
#3

is Hidden this in the cards for this langauge?

    void addSlide (NoteHandler& this, int channel, float slide)
    {
        for (int i = 0; i < int(this.activeNotes); ++i)
            if (this.noteArray.at(i).channel == channel)
                this.noteArray.at(i).slide = slide;

        if (int(this.activeNotes) > 0)
            this.currentSlide= this.noteArray[this.activeNotes - 1].slide;
    }
#4

Maybe. We want to avoid too much OO style, but we’ve talked about adding some syntactic sugar for creating method-style functions.

#5

Padsynth + phaser :slight_smile:

5 Likes
#6

The Faust DSP language has a (still experimental) SOUL backend that allows to directly compile Faust DSP source code in SOUL source code. The resulting auto-generated SOUL code can then be used along hand-written SOUL processors or graphs.

For now this is only available in Faust github. A faust2soul script simplifies the Faust DSP => SOUL code compilation process, including the production of MIDI controllable polyphonic instruments.

4 Likes
#7

Some examples to test:

Bell modal synthesis (use the gate slider to hit the bell):

ZitaRev:

Polyphonic MIDI controllable clarinet physical model:

#8

That’s okay, I didn’t need to get anything productive done today :slight_smile:

Congrats to the SOUL team - seems like a significant milestone here…

#9

And experienced Faust users can basically try to convert all of their favorite Faust examples in SOUL code.

#10

yeah, just add a member keyword to indicate a function is a member function, maybe?

    member void addSlide ( int channel, float slide)
    {
        for (int i = 0; i < int(activeNotes); ++i)
            if (noteArray.at(i).channel == channel)
                noteArray.at(i).slide = slide;

        if (int(activeNotes) > 0)
            currentSlide = noteArray[activeNotes - 1].slide;
    }
#11

Hmm, we’ll have a think, and would also have a look at how other modern languages do this.

#12

Nicely done! I finally got a moment to play around. The language overall is really straightforward and intuitive to use (as outlined here on GitHub).

Can I do a feature request here? Have you considered syntactic sugar to iterate over collections like foreach or range-based for?

3 Likes
#13

First up, yes please do suggest features we could include! We’re got a long list of things we’d like to do but i’m sure there are plenty of ideas we’ve not thought about that will make the language easier to use and more flexible.

range-based for is on the list, that’s certainly a useful addition.

2 Likes
#14

This is awesome, congratulations Jules + JUCE team!

Just had great fun making a crude version of Steve Reichs Piano Phase from the ringtone example. :slight_smile: https://soul.dev/playground?id=9d14895d4da7a24cf47fc0fc90bb3dcd.

having a ShaderToy esque (soultoy?) server to browse and rate other peoples examples would be an amazing learning resource for the language (and maybe kickstart a similar popularity surge as glsl enjoyed from shadertoy). Also looking forward to being able to #include / import other .soul files / processors and graphs to build up to higher level abstractions.

Keep up the awesome work.

7 Likes
#15

Thanks for the kind comments, and nice example!

Looking at your code, I see that you’ve stuck a mono->stereo mixer in, and since it’s just hard panned left/right you can get away with a different approach - the convention if you have two mono output streams is that they are left and right, so you can write it more simply like this:

https://soul.dev/playground/?id=d601163eeca174d8b659dbee2c48ef78

+1 for importing stuff

#16

Thanks for that. I presumed it wasn’t the ideal approach and was hoping someone would chip in :slight_smile:

I also initially tried:

output stream float<2> out;

connection
{
    piano1.out -> out[0];
    piano2.out -> out[1];
}

and wasnt sure why that wasnt allowed at first. Good to know about the stereo convention though.

#17

Well, the reason that doesn’t work is we’ve not implemented it yet. Good to see you’ve guessed what the syntax will be when we get it done though!

#18

I’m experiencing a bug with the SOUL playground where, when playing two or more notes on any of the synth examples, after a second or so the sound will sort of “pulse” after which only one of the notes is playing.

Most noticeable on the SineSynth example when playing two notes a semitone apart, the expected phasing is audible but after a second only one of the notes is playing.

I’ve experienced this on both my Windows 7 laptop and Windows 10 desktop. Using chrome with both - also tried Edge on Windows 10 but had the same issue. Works fine on my android phone. Using the built-in, default audio device (jack output) on both Windows 7 and 10.

#19

Are you by any chance using the built-in keyboard to trigger notes? If so, the problem is that key repeat tends to cause multiple events to get sent through (so holding down ‘a’ for example sends through multiple note ons to the SOUL code). It’s basically a bit broken, and is only really of use to trigger a few notes for testing. I’d suggest attaching a real midi keyboard for proper noodling.

#20

Ahh, yes I was using the qwerty keyboard! I’ll try MIDI instead!