I create a new model, and simply give it one line:xline.note_columns[1].note_value = math.random(36,48) .I keep applying to the selected track, but I’ll get a new random sequence every time**.
If I give the model a second line,math.randomseed(0),and I apply to the track, every note is the same note***. I’m guessing this is because of the behavior of xLine*?
So I get rid of that second line. But now I was clever and thought about setting the random seed in the scripting console; maybe that can set Renoise’s global random seed? So I enter the commandmath.randomseed(0)directly into the terminal. A satisfyingly greenmath.randomseed(0)appears in the console. After I played around with that, I realized that I_could_ reproduce the same random sequence. But I have to entermath.randomseed(0)into the terminal every single time before I apply the model to the track. If I don’t, I get a new sequence every time I apply**. (I explain further below at the footnote**)
Is that event handler supposed to take care of that? I did exactly as you said, but I still get a new sequence every time I apply**.
Yes, you nailed it. The random seed has to be set at the right moment to work like expected. And the right time (in this case, anyway) would be when output is first started.
That would be the purpose of the event handler - it would simply be a “hook” which you hang your randomseed statement on.
So please don’t be confused. It’s certainly true that xStream documentation is rather scarce, but that just makes it so much easier to improve
But that’s the thing, I have no exact idea how xLine operates. I tried to read the lua code, but I couldn’t make heads or tails of it. I wish your documentation would describe it better. I wish it said something like, “xLine has two methods, note_columns and effect_columns”, “See renoise.NoteColumn for details on editing note values”, “here’s an example on how to blah blah blah”. Instead, I’m faced with these cryptic function names with cryptic descriptions that mean nothing to me. I have no exact idea how xLine or xinc works. Only a confident guess [of their behavior] after experimenting around with them. (I don’t even know what xpos does).
xLine is a ‘virtual’ representation of the renoise.Patternline, accepting exactly the same input - note_string, instrument_value, etc. But, unlike renoise.PatternLine it doesn’t have to existing in an actual pattern somewhere. Having a virtual representation is required for a tool like xStream to work, because the final line on which output is written might change during playback (for example, if you enable pattern loop near the end of a pattern the tool will redirect it’s output to the top of the pattern instead of the next pattern). Also, it allows us to capture things in a buffer and optimize the output in various ways.
xpos is also a virtual representation of a fundamental Renoise API component - the renoise SongPos. It contains the current sequence index and line number.
(remember, you can always use print(), rprint() and oprint() to output various debug information to the console)
xinc is the ever-increasing counter that doesn’t care about patterns but simply keeps increasing for as long the tool is streaming.
So you should use xpos if you somehow wanted your model to rely on the pattern structure, or xinc if you don’t.
All I have is the many examples, with no line-by-line comments, and the cryptic documentation with “functions” that aren’t even used in the examples.
In one of the last released I renamed a bunch of models to “Demo-something” since they are less complex than the rest. Not with line-by-line comments, but that should certainly be doable. So, not saying that the documentation can’t be improved - it always can.
And when you refer to the cryptic documentation, I guess you found the xLib documentation, contained somewhere deep in the source of xStream? Well, that’s the framework powering all of my newer tools: xRules, PhraseMate, Noodletrap, etc. This is definitely not meant to be a entry point into xStream, rather it should be hidden from plain sight. I’m sorry - seeing now that the README does refer to the xLib documentation. instead, I’ll change it to use the description above + add a mention of how to make good use of xinc in the ‘Getting started’ section of the readme