13 angels

13 angels

delay vowel synth

13-angels

13 angels is a duophonic delay vowel synth. It has two “angels” producing a vowel and a delay parameter which will define the time between the note press and the right angel’s vowel.

I got the idea from the song “13 Angels Standing Guard 'Round The Side Of Your Bed” by A Silver Mt. Zion. The song has this haunting “Aouuu” sound throughout the track which I really wanted to recreate on the Norns.

Requirements

MIDI controller

Documentation

  • k2 - change vowel
  • k3 - change delayed vowel
  • All encoders change the delay time between the two vowels

Download

v1.2.0 - https://github.com/dzautner/13-angels/archive/v1.2.0.zip

Changelog

v1.2.0

  • Implement MIDI channel selection for church techno opportunities :wink: (thanks @xmacex!)
  • add attribution to the original engine author Matias Monteagudo
  • Free the engine on exit, per Norns SC API (thanks @xmacex #2!)
  • finer control over the delay
  • parametrize delay control
56 Likes

Video Walkthrough

2 Likes

Woah looks interesting! Nice capcom beat em up esque graphics too :smiley:

4 Likes

Love the interface! I see visual changes when I hit a note but no sounds. Also from Supercollider:

*** ERROR: SynthDef choir not found

FAILURE IN SERVER /s_new SynthDef not found

*** ERROR: SynthDef choir not found

FAILURE IN SERVER /s_new SynthDef not found

*** ERROR: SynthDef choir not found

FAILURE IN SERVER /s_new SynthDef not found

*** ERROR: SynthDef choir not found

FAILURE IN SERVER /s_new SynthDef not found

FAILURE IN SERVER /n_set Node 1265 not found

*** ERROR: SynthDef choir not found

FAILURE IN SERVER /s_new SynthDef not found

*** ERROR: SynthDef choir not found

FAILURE IN SERVER /s_new SynthDef not found
FAILURE IN SERVER /n_set Node 1269 not found

FAILURE IN SERVER /n_set Node 1267 not found

and in when starting up :

free engine: an Engine_Choir

CroneEngine.free

a CroneAudioContext

WARNING: SynthDef choir too big for sending. Retrying via synthdef file

[ CroneEngine adding command, noteOn, ffii, a Function ]

[ CroneEngine adding command, noteOff, f, a Function ]

[ CroneEngine adding command, amp, f, a Function ]

[ CroneEngine adding command, attack, f, a Function ]

exception in GraphDef_Load: exceeded number of interconnect buffers.

[ CroneEngine adding command, delay, f, a Function ]


– crone: done loading engine, starting reports


engine: an Engine_Choir

while reading file: '/home/we/.local/share/SuperCollider/synthdefs/choir.scsyndef’exception in GraphDef_Load: exceeded number of interconnect buffers.

I did a reboot before starting it by the way.

@robotfunk Intrestingly I got the same error when developing against a local SC server until I added Server.local.options.numWireBufs=128 before the SynthDef, but it worked straight out of the box on the Norns so I figured it’s better to not mess with server options that might affect other engines.

Can you possibly share what Norns are you running? I only tried it on the Fates.

This is on a Norns shield, I will test it on my Fates in a minute and will let you know.
EDIT Works fine on Fates after a reboot.
EDIT2 Now after ANOTHER reboot it works fine on my Norns shield as well, go figure. I know for a fact I rebooted the first time because it was complaining about a missing engine.

1 Like

I’ll admit it’s pretty wonky engine code - everything is possible with SC if you believe strong enough! Happy it worked in the end, but I’d love to find out why it didn’t from the start. I’ll dig a bit deeper into Fate’s SC configs tomorrow and see if it has any obvious differences from the upstream Norns repo.

seems maybe worth a refactoring pass to obtain a synthdef that is less Yuge, parameterized by formant position etc.

smaller optimizations that stick out to me:

  • memoize repeated fq*bend.midiratio , in particular just perform midiratio outside the synth

  • Mix.new([a, b, c..]) is usally better than (a+b+c+...) or even [a, b, c...].sum, b/c it does some basic hierarchical reduction…

  • i would use .send instead of .add to avoid going through the SynthDescLib


finally, the big problem, which might be behind the report, is that this engine doesn’t implement free and therefore doesn’t clean up any synths that happen to be running when the engine is switched.

AFAIK, there are no differences in the SC configuration on fates. any manipulation of ServerOptions would be here… but we don’t do any right now.

1 Like

Ruahaha totally laughed at that law of sound engineering. Too true!

I like how you are thinking about what sound instruments can and could be :slight_smile: Respect.

:angel::angel:

Edit: I was low on ideas yesterday what to layer on this techno groove on OP-Z but this fits just fine. Thank you, I really enjoy these concept scripts.

I quickly modified on_midi_event to filter out clock and cc events, and just respond to a particular channel I use on OP-Z for driving external gear. I should parametrize it and submit a pull request.

function on_midi_event(data)
  msg = midi.to_msg(data)
  -- filter out non-note events
  if msg.ch == 14 then
    if msg.type == "note_on" or msg.type == "note_off" then
      play(msg)
    end
  end
end
7 Likes

Had a go (on norns shield), seems really promising! Excited to use this for dungeon synth purposes :slight_smile:

I am getting some bugs, there’s a kind of growly low-bitrate distortion sometimes (when multiple notes are playing?), also I’m getting continuous stuck notes which continue even when I switch to a different script ! :-S And sometimes the buttons become quite unresponsive.

Also the output seems pretty high (I think someone mentioned that about the Lost Futures script too)

@dzautner
FRACKEN AWESOME!
this looks and sounds so neat!
i’ll be weaving in this noiz in a 13 Demons approach.
:smiling_imp:

1 Like

Same thing over there. Worked after the second reboot. Also getting the low-bitrate distortion thing when more than 2 notes are played. Love the graphics and the concept though!

1 Like

Trying again, seems like when the low bit sound happens the Norns buttons also get unresponsive… So presumably it’s some kind of processing-power related issue and the whole thing is stalling a bit somehow?

@Cementimental what power supply do you use ?

I had similar issues on another script with my Shield and it was very likely related to the power supply I used. I now have a 3A one made for RPi (with a switch on the cable, which is great with a Shield as you don’t have to plug/unplug things) and all the scripts behave properly.

I also noticed when I briefly tried to power my Shield from my laptop (on battery) that it was definitely underpowered and struggled to do stuff but it was still on. The Shield turning on and looking like it’s ok is not a sure sign that things actually are ok, there might not be enough power for the scripts to work as designed.

Hey there! This looks really awesome and I’d love to play with it. Do you know if it will be available via Maiden soon? I’ve just looked there and refreshed and don’t see it. Thanks!

@zebra
Thanks for the practical advice! As you probably figured out I’m quite new to SC development.

I will try the above and see can I reduce the Yugeness.

@xmacex

My god that sounds so cool!!! Did not expect it to be used for groovy tunes, church techno next big hit? (:

@Cementimental sounds like I might be leaking memory somewhere. I’ll spend some time to focus on the engine side for next release instead of the artistic UI :sweat_smile:

@Zeke_B
I actually only had the Norns for like a week or two, so I’m not really sure what’s the process to get listed in maiden. Maybe someone else has an idea?

4 Likes

Visual-wise:

Sound-wise:

12 Likes

@dzautner
well…
i made a serious attempt to “choral” the Devil’s Choir at the gates of Heaven…
(play on words…:stuck_out_tongue: )
but to no avail…
other demons were at work distracting them including an actual power outage.
(there’s actually snow and ice here in Houston right now)
kept getting crashes…and some of them really hard norns crashes where the norns Vulcan Death Grip (k3+k2+k1) would not work.
i was forced to use the small white kill switch on the bottom. ACK!

when i attempted to send a ;RESTART from maiden…
i got this: ;restart => Method call timed out

i left the WiFi on norns #2 on hoping i could catch some info if it freaked out.
and it did…it currently has a note locked on.
when i hit play on the sequencer maiden streams all this:

Summary

lua:
/home/we/dust/code/13-angels/lib/midi_helpers.lua:12: attempt to perform arithmetic on a nil value (local ‘note’)
stack traceback:
/home/we/dust/code/13-angels/lib/midi_helpers.lua:12: in field ‘note_to_hz’
/home/we/dust/code/13-angels/13-angels.lua:41: in global ‘play’
/home/we/dust/code/13-angels/13-angels.lua:35: in field ‘event’
/home/we/norns/lua/core/midi.lua:408: in function </home/we/norns/lua/core/midi.lua:398>

lua:
/home/we/dust/code/13-angels/lib/midi_helpers.lua:12: attempt to perform arithmetic on a nil value (local ‘note’)
stack traceback:
/home/we/dust/code/13-angels/lib/midi_helpers.lua:12: in field ‘note_to_hz’
/home/we/dust/code/13-angels/13-angels.lua:41: in global ‘play’
/home/we/dust/code/13-angels/13-angels.lua:35: in field ‘event’
/home/we/norns/lua/core/midi.lua:408: in function </home/we/norns/lua/core/midi.lua:398>

lua: /home/we/dust/code/13-angels/lib/midi_helpers.lua:12: attempt to perform arithmetic on a nil value (local ‘note’)
stack traceback:
/home/we/dust/code/13-angels/lib/midi_helpers.lua:12: in field ‘note_to_hz’
/home/we/dust/code/13-angels/13-angels.lua:41: in global ‘play’
/home/we/dust/code/13-angels/13-angels.lua:35: in field ‘event’
/home/we/norns/lua/core/midi.lua:408: in function </home/we/norns/lua/core/midi.lua:398>

lua: /home/we/dust/code/13-angels/lib/midi_helpers.lua:12: attempt to perform arithmetic on a nil value (local ‘note’)
stack traceback:
/home/we/dust/code/13-angels/lib/midi_helpers.lua:12: in field ‘note_to_hz’
/home/we/dust/code/13-angels/13-angels.lua:41: in global ‘play’
/home/we/dust/code/13-angels/13-angels.lua:35: in field ‘event’
/home/we/norns/lua/core/midi.lua:408: in function </home/we/norns/lua/core/midi.lua:398>

lua: /home/we/dust/code/13-angels/lib/midi_helpers.lua:12: attempt to perform arithmetic on a nil value (local ‘note’)
stack traceback:
/home/we/dust/code/13-angels/lib/midi_helpers.lua:12: in field ‘note_to_hz’
/home/we/dust/code/13-angels/13-angels.lua:41: in global ‘play’
/home/we/dust/code/13-angels/13-angels.lua:35: in field ‘event’
/home/we/norns/lua/core/midi.lua:408: in function </home/we/norns/lua/core/midi.lua:398>

also…
it seems like the delay would start feeding back and there was no way to stop it.
sounded cool…but…heh!
once any of them started doing this stuck note it would not let me out of the app at all.

animations would still move.
it would still receive note on messages and the angels would speak.
knobs would still change delay variables.
none of the buttons would work.

one last thing i noticed…and this was my fault but…
if too much MIDI info came across the app would freak out and just lock on a note.
i had accidentally forgot to mute track 2 and the drum track on a BeatStep Pro.

if there was a way to assign norns a global midi channel…well that would be awesome.
but…not the case. :stuck_out_tongue:
i was using the Cirklon on one norns and 2 BeatStep Pros to control the other two.

3 Likes

Yes it’s slightly similar to distortion I was getting for that reason when I first built the shield but I do now have such a PSU and everything’s fine with other scripts :slight_smile:

Hi guys!
I just released a new version which significantly reduces the clutter in the engine code. I couldn’t reproduce the same noisy artefacts again unless I set the delay to some high number and pushed as many buttons as I could, but even then it was minimal crackling and nothing compared to previous version’s auto-generated noise concert.

I also added actual velocity control. I apparently forgot a hardcoded value there before, which will explain a thing or too about the volume…

@zebra

Thanks a lot for the tips, I actually didn’t end up using bend.midiratio so I removed it completely. I changed to Mix.new where relevant and switched to .send.

I removed about half of the voices that come on note press, which obviously was a great relief for the engine and doesn’t seem to make a huge difference on the final sound.

@xmacex I used your snippet to remove play calls on non note events, thanks! it solved a lot of issues I believe.

@SPIKE

First of all - WOW, what a mouth-watering setup! Now I want 13 Norns standing guard 'round the side of my bed.

Secondly, I believe the main issue here was the same one @xmacex experienced - MIDI CC messages were wrongly parsed as note events, causing havoc. I hope the fix and the reduced engine clutter will allow this awesome setup to work as expected (or better!).

Cheers and happy jamming,
Daniel

8 Likes