Spellbook: Plain text sequencing

I don’t use internal clocks on sequencers, I like to clock all my other stuff with divisions and maybe have swing and other features… so it’s just better to use a dedicated module for it. Although if you do have an internal clock on your tracker, then you would also need to add an extra clock output. I think it complicates things when there are lots of great clocks to choose from.

This module is turning out really nifty, I think it’s very innovative!! The demo patch was also very nice sounding! I do like the CV indexing, it’s something that I wish more sequencer would implement, I use it on my Mimetic Digitalis in eurorack. If you have 100 steps, then I guess .1V is a step? Do negative voltages wrap around?

I have a whole list of little suggestions (that you should just please feel free to ignore!!!):

Context menu control of the font size, mainly with a larger option. In cases where you only use a few outputs the text could be a lot larger to fill up the width of the module, and it would be much easier to use if I didn’t have to zoom in to make the spreadsheet fill the screen. Or in other words, it would be cooler if the spreadsheet were way more zoomed in.

Or… okay okay hear me out. Make the spreadsheet part a little bit smaller so that you can have a display window at the top. The top window displays just the current step much larger, and scaled to fill the width. Then when you go to edit the sequence, you would be able to edit it from the current step window, and have a larger interface. It would allow you have the rest of the sequence displayed smaller, and by clicking around to where you want the top box is larger. This is basically how Excel works, btw, but that’s a really proven way to interact with a spreadsheet.

A high-contrast or accessibility mode that puts text over solid dark grey background, maybe with a nice looking border or transition around the screen part. Bonus if you can make it look like slate or something that still matches the theme. (basically I find the colored text over varigated background to be difficult to read, but I really get the theme and look is important)

Column headers that make it more clear what the different columns are controlling. Allowing them to be use user named or taken from Row1 would be cool. I always do it in Excel, lock the top row when I scroll a big sheet.

Columns borders that are rendered by the module as lines, and maybe a tiny space between adjacent columns. This should be possible to do since you are using a fixed-width font.

Some kind of % display that shows where the tracker is in relation to the whole sequence, like a scroll bar indicator or something. For example, you could put a health bar looking thing at the bottom left, and have a marker on it that indicates the current position in the sequence.

The mouse pointer should turn into a quill pen when you mouse over the module :slight_smile: That would be really fun.

nice but not really necessary

1 Like

Well, that certainly looks interesting.

Cat Standing

Is it resizable?

No, but it really needs to be. At some point I’m going to sit down and figure out that and Undo support.

Today’s focus was aesthetic changes, it’s now got a backdrop for the text, zebra striped columns, and comment highlighting:

3 Likes

Going to consider this build a candidate for submitting to the Library, if no one finds any bugs:

Release Release v2.1.0 · Jadael/TMT (github.com)

Bonus new module: “Stats”! Get the mean, mode(s), median, geomean, sum, product, count, sorted list, and distinct list of a polyphonic cable.

Also a blank panel, for fun.

For examples of resizing and undo/redo, you might look at the source of my TTY and Fermata modules. Oh, and make sure that resizing is itself in the undo/redo queue.

And if you ever consider having your module send or receive text via cables, I hope you’ll consider the Tipsy protocol.

Fermata has been an invaluable resource for study during the entire project. I built it up from the core Notes module, but constantly referred to Fermata for an understanding of just, how to even think about what I was doing.

I can imagine an expander module that sends each cell’s content as Tipsy to another 16 outputs, but I don’t know what that might be useful for. Perhaps a way to accept Tipsy input and write that text into the cells :thinking:

I’m thrilled to hear that! And hope that any stupidity on my part hasn’t infected your module :wink:

Right now BASICally can output Tipsy, but it doesn’t yet have string variables, so it’s not as easy as you’d hope. It doesn’t accept Tipsy text yet. I guess I’m thinking that one might send generated text to Spellbook, for it to incorporate into it’s instructions…well, I should try Spellbook out before considering that a useful suggestion.

TTY accepts Tipsy, so if you had status or debug output that users might optionally want to see, that’s a way to display it. Again, not really sure that’s germane.

Mainly I saw a module relying on text and thought, oh, hey, this might be relevant.

Spellbook could be a justification for another module idea I’ve had: a way to perform with text. Like, imagine a document with bits of text in it, with the ability to edit it, or select some text and send it to another module to perform. Like live coding, but separating out the editor from the interpreter, to allow for multiple kind of interpreters.

1 Like

I also feel like an internal clock isn’t worth the bother. There are many wonderful clock modules out there with fantastic features. I’m particularly fond of Impromptu Clocked — I know how to make it do all kinds of tricks, and it’s in my muscle memory.

People can also use something like a gate sequencer as an intentionally irregular external clock. Or a square wave coming out of a frequency-modulated LFO. And so on…

I love this idea of a text-based sequencing language. There is so much potential here. I’m definitely keeping an eye on this module!

1 Like

I also agree that an internal clock is unimportant to me. For my own modules, I provide internal clock but I always use an external clock. I prefer to use an Impromptu CLOCKED as the master clock. I spent quite a bit of effort in the beginning getting my modules to also take the CLOCKED BPM out and set my module’s internal BPM accordingly. All of this becomes more important for time signature based sequencers.

1 Like

Congrats! Very nice module. It’s easier for me than working with Loud Numbers and I see myself replacing BASICally in many of my patches with Spellbook. :ok_hand:

I finally installed it, and am starting to play around. It’s super neat! I’ll share a patch once I make something interesting.

Couple questions/comments: -If I make a column header row, and reset the steps, why does it go to the header row? I think the header should be row 0, and reset should take it to row 1. Also, possible I am using it wrong…

-I don’t understand how the reformatting/updating works. It only reformats the text if I have a clock patched, or stop the clock. No way to have the module reformat the sheet, maybe you need a button for that?

-If the clock is running, it doesn’t update changes to the sequence. I have to stop the clock for the update to happen.

-A manual reset button and manual trigger advance button would be nice to have. A step-backwards, or reverse input would be handy too perhaps?

-Clicking on the step number should jump to that step.

-Hitting Initialize in the context menu or cmd-I should reset the module to the starter text I think.

Right now the rows have to be in row 1 (there is no “header” row), but I do want to make it so ?? starts a full-line comment, which lets that entire row be ignored when counting “steps”, especially for having a row 0 as column labels.

I originally imagined that optional row numbers might be part of the syntax, too, like:

1: C4, X
3: D4, X
4: D#, |
6: E4, X

The idea being you could write sequences in a “terse” style that omits empty steps if you wanted, to make long sequences easier to read, write and share. Feels complicated though lol.

It parses the text onDeselect(), the idea being that if it were constantly checking and re-formatting as you typed it would be difficult to type anything. I think I do want Ctrl+Enter to be a hotkey for “re-parse” though, along with Ctrl+Left/Right to jump cells.

Step Back is a great idea.

Release Release v2.1.1 · Jadael/TMT (github.com)

Spellbook

  • Comments in the first step (not “step 0”, unfortunately, coming soon maybe) become labels on the outputs
  • “G” replaced by “W” as a keyword for “Gate” so it doesn’t conflict with the note “G”
  • Created some manufacturer presets
  • Added a little tutorial sequence as the default text
  • Reset restores it to the tutorial sequence
  • Renamed “clock” to “step forward”
  • Added a “step back” input
  • Fixed some edge cases for indexing
  • Index input can be toggled between two modes: Relative, where 0v = Step 1 through 10v = Last Step, or Absolute Mode, where 1v = Step 1, 2v = Step 2, etc.
    • If you send a clean linear ramp to Relative Index, you could use Spellbook as a crude oscillator or shape generator (there’s no filtering or anti-aliasing of any kind, so you’re on your own with making it sound good). See the ‘Waveforms’ preset.
  • Two new outputs output the Relative and Absolute index of the current step, so you can sync or address Spellbooks with each other (e.g. you could address one Spellbook using a sequence from another using Absolute, or sync them like Phasors using Relative)
  • Added more note names to the parser, such as non-standard ones like E#, and double sharp ##/double flat bb
  • Added horizontal scrolling, and changed scroll behavior so it only updates if the cursor would be out of view, so it’s less jumpy
  • lots of little bugfixes and tweaks I’m forgetting

Other

  • Added Stats module to the readme, and updated the screenshot for Spellbook
  • Made Stats update every 10ms by default to reduce CPU load, with a toggle for operating at sample rate. Again, no special attempts to anti-alias or anything, so probably don’t use it for audio signals.
  • Added a blank panel to learn how to make resizeable panels
2 Likes

v2.1.3 · Jadael/TMT (github.com)

  • :tada: Now resizable by grabbing right hand edge :tada::balloon::balloon::balloon: - I couldn’t have imagined doing this a week ago lol
  • New formats added to parser: <Number>Hz and <Number>ct (for cents), both translated to 1v/octave like other pitch formats.
    • I’m on the hunt for more weird ways to write pitches and/or voltages, let me know what you’ve seen, especially weird esoteric formats.
  • Removed outdated G for “gate” syntax in presets, default text, etc.
  • Fixed a bug where some double sharps/flats would not be found because normal sharp/flats within them would be found first, this should probably be something nicer than a lookup table
5 Likes

I use relative harmonic degrees and scale integer intervals 1-7 (1.0-7.0) and (I-VII) for scale intervals (1st,2nd,…,7th) relative to the current diatonic scale. So, my PS-PurrSoftware modules Meander and ModeScaleProgressions can be sequenced for circle-of-fifths chord progressions and scale melody in Meander and chord progressions in ModeScaleProgressions. Actually, the modules accept these intervals in octal-radix interval.octave floating point (decimal) form, so any note in the scale can be so played at (almost) any octave.

There are a few other modules by others that supports this notation on one way or another.

Just to clarify, this allows any of Meander’s (and ModeScaleProgressions) ~85 predefined chord progressions to be played in any mode and root diatonic scale, internally in the modules, or custom progressions can be input into my modules’ “degree” inputs. My modules output these chord degrees for other modules to use. Actual usage details are in my manual. Input can come from a MIDI keyboard or from a Rack CV source but the “gate” degree input is handled differently between keyboard and CV control. (hint, in CV mode, the 1-7 degree is input into my modules’ degree inputs and the adjacent gate input. This is just so that my modules know how to do the conversions.

BTW, the Aaron Static DiatonicCV module can accept the “degree” CV’s input to the “Chord” inport.

Hrm, I do keep thinking about scale degrees (and Solfege), but right now the syntax has no conception of key/mode/time signature/etc. It is similar to a tracker in that way.

Maybe that’s fine though, and that’s just something you toggle on the module itself, and maybe have a new command in the sequence’s syntax that updates the key and/or mode? Or the key and mode could be part of the cell’s value, in a format like <key><mode><degree> or <root>+<interval>? Either way, it also needs to be easily distinguished from plain decimal values and/or note names.

EDIT: On the other hand, you can already do things like use one column for the root/key, do your melody all in octave 4 in another column, and add together their output voltages, maybe also quantizing them or sending to something like Plurm chordscalequantizer. That would be the “modular” way to do it, and does have a certain appeal of “austerity”.

I wonder how difficult it would be to have it import “ABC” notation, which can be created with plain text editors? See https://abcnotation.com

By way of example, this text …

X:1
T:Speed the Plough
M:4/4
C:Trad.
K:G
|:GABc dedB|dedB dedB|c2ec B2dB|c2A2 A2BA|
  GABc dedB|dedB dedB|c2ec B2dB|A2F2 G4:|
|:g2gf gdBd|g2f2 e2d2|c2ec B2dB|c2A2 A2df|
  g2gf g2Bd|g2f2 e2d2|c2ec B2dB|A2F2 G4:|

… would be interpreted as:

Speed the Plough

I speculate that it was developed for sharing tunes over usenet and SneakerNet, especially folk tunes. There’s a crapload of repositories of traditional tunes in that format.

3 Likes

I wonder how difficult it would be to have it import “ABC” notation, which can be created with plain text editors? See https://abcnotation.com

I think it would fit better a standalone module similar to Voxglitch One Point.