code logs -> 2008 -> Fri, 08 Aug 2008< code.20080807.log - code.20080809.log >
--- Log opened Fri Aug 08 00:00:20 2008
00:09 crem [~moo@Nightstar-28703.adsl.mgts.by] has quit [Ping Timeout]
00:24 crem [~moo@Nightstar-28703.adsl.mgts.by] has joined #code
00:29 crem [~moo@Nightstar-28703.adsl.mgts.by] has quit [Connection reset by peer]
00:29 crem [~moo@Nightstar-28703.adsl.mgts.by] has joined #code
00:41
<+Consul>
You know, I'm kinda liking the idea of our preset files actually being Lua scripts. Just load and run, and it loads itself.
00:41
<+Consul>
It could also load additional functions that would be used by the synth engine as part of the preset.
01:00
<@McMartin>
You'll need some performance checks, of course, but remember that efficiency isn't an issue until you can prove you don't have it.
01:01
<@McMartin>
And if it's just config, you're golden
01:01
<+Consul>
Well, I have ideas beyond that, but we'll see what is and isn't possible.
01:02
<+Consul>
The scripting will be mostly event-based.
01:02
<+Consul>
Anyway, gotta go, heading off to get a plant...
01:08 gnolam [lenin@Nightstar-2037.A163.cust.bahnhof.se] has quit [Quit: Z?]
01:14 Derakon[AFK] is now known as Derakon
01:20 crem [~moo@Nightstar-28703.adsl.mgts.by] has quit [Ping Timeout]
01:45
<+Consul>
And we are now the proud owners of an aloe vera plant, finally.
01:47
<@AFKSkull>
yay
01:47
<+Consul>
Hehe
01:47
<+Consul>
Too bad it won't make me a better coder.
01:49
<@AFKSkull>
it will sure come in handy if you burn yurself though
01:50
<+Consul>
Indeed.
01:50
<+Consul>
Which happens every so often, as an avid cook.
01:50
<@Derakon>
Heh.
01:50
<@Derakon>
Don't fry without a shirt on~
01:50
<+Consul>
I don't.
01:50
<+Consul>
Never fry bacon naked.
01:50
<+Consul>
I learned that first-hand.
01:50
<+Consul>
And now that I've planted that image in your heads...
01:52
<@Derakon>
You call that a mental image?
01:52
<+Consul>
You would if you saw a 330-pound man naked. :-P
01:52
<@Derakon>
I've seen worse.
01:52
<+Consul>
To be fair, though, I wasn't that big when I learned this object lesson. I was actually thin enough to be attractive to ladies.
01:53
<+Consul>
Can a Lua script modify itself?
01:53
<@Derakon>
I wouldn't be surprised, but you might have to reload it after. Talk to TF; he's the Lua guru.
01:54
<@ToxicFrog>
Can a Lua script load more Lua code at runtime, and call it? Yes.
01:54
<@ToxicFrog>
Can a Lua function replace itself? Yes.
01:54
<@ToxicFrog>
Can these facilities be used to create self-modifying lua code? Yes.
01:55
<+Consul>
The idea is, if someone changes their preset, then saves the changes...
01:55
<@ToxicFrog>
Can you edit the program AST directly and see changes immediately reflected? No, it's compiled to bytecode and the IR is not available for manipulation.
01:55
<+Consul>
So, it would need to reload after saving.
01:55
<@ToxicFrog>
Ummm
01:55
<@ToxicFrog>
Not really
01:55
<@ToxicFrog>
The preset is a bunch of data and code stored in Lua space, right?
01:56
<@ToxicFrog>
When they change their preset, those changes are immediately reflected in Lua, because that's where it's stored
01:56
<+Consul>
Well, my idea is that the Lua script itself *is* the preset.
01:56
<@ToxicFrog>
When they save it, the contents of the preset structure are saved to disk
01:56
<@Derakon>
So if the preset is a table, then you load the file into memory, thereby getting the table.
01:56
<+Consul>
Because that way, Lua functions can be part of the preset, and part of the synth.
01:56
<@ToxicFrog>
No, the lua script is how the preset is stored on disk.
01:56
<@Derakon>
When the user updates their presets, you update the table.
01:56
<@Derakon>
When you save the presets, the table is rewritten to disk.
01:56
<@ToxicFrog>
Once loaded into memory, it's not "a script", it's "a collection of data and code, which can be read, write, and called"
01:57
<@ToxicFrog>
*written
01:57
<+Consul>
Ah, I think I see what you're saying.
01:57
<@ToxicFrog>
The C equivalent would be, say, you have a file consisting of a list of numbers seperated by ,
01:57
<@ToxicFrog>
On disk, it's a list of comma seperated values
01:57
<@Derakon>
In memory, it's an array.
01:58
<@ToxicFrog>
But you'd probably load it into an array to actually use it, and changes made are reflected immediately in the array
01:58
<+Consul>
Okay, no problem there...
01:59
<+Consul>
I'm trying to figure out how to get my idea across...
01:59
<+Consul>
Although now that I think about it, it might not be such a good idea.
01:59
<@ToxicFrog>
One thing to keep in mind here is that in Lua, functions are first-class and can be created at runtime.
01:59
<@Derakon>
If you want to put actual code into the presets, well, presumably your users aren't going to be writing Lua scripts in their UI.
01:59
<@Derakon>
So what you'd save is the parameters used to generate the Lua code, not the code itself.
02:00
<+Consul>
Derakon: Yeah, that's it! The presets are actual code.
02:00
<@ToxicFrog>
Well
02:00
<@ToxicFrog>
You would save the parameters as code
02:00
<+Consul>
That was the idea, anyway.
02:00
<@ToxicFrog>
Because that makes it totally trivial to load
02:00
<@Derakon>
Right, TF...
02:00
<+Consul>
But, in the end...
02:00
<@ToxicFrog>
But you would save it as code that recalls the parameters of the widget used to create the underlying function
02:00
<@ToxicFrog>
You wouldn't dump the function's bytecode directly
02:01
<+Consul>
It would probably be best if Lua functions that are actually part of the preset to be stored separately. That way, they can be used as part of other presets.
02:01
<@ToxicFrog>
(even if it's a user-defined function, you'd probably want to dump source so that you can edit it after a save/load)
02:01
<@Derakon>
So for example, instead of writing to disk "function f(a) {return a + 5}", you'd write "local x = 5" and from that generate the function that adds x to its argument.
02:01
<+Consul>
From the GUI standpoint, my dream is for people to right-click on a control (knob, or slider, or whatever other widget), and be able to associate a function with it.
02:02
<@ToxicFrog>
Nod
02:02
<@ToxicFrog>
What I'm seeing this as is that it gives you a list of pre-defined functions, which can be tuned
02:02
<@ToxicFrog>
Eg, average, linear interpolation, sine, etc
02:02
<+Consul>
If these Lua scripts can access the engine, and the incoming OSC control data, we could make a pretty powerful sampler.
02:03
<@ToxicFrog>
And a "user defined" box that lets you type in an expression for creating your own functions
02:03
<+Consul>
Oooh, ToxicFrog is right on...
02:03
<@ToxicFrog>
If you use a pre-defined, it gets saved to disk as a thingy that remembers which predefined function you used, and what its parameters were
02:03
<@ToxicFrog>
If you enter your own, it gets saved to disk as source code, so you can edit it later
02:04
<+Consul>
But as a separate script, rather than part of the preset.
02:04
<+Consul>
Code reuse and all that. :-)
02:04
<@ToxicFrog>
You mean the canned functions, or the user-defined ones?
02:05
<+Consul>
Or maybe we could give the option of saving within or outside the preset file.
02:05
<+Consul>
User-defined.
02:05
<+Consul>
The canned ones will already be separate files.
02:05
<@ToxicFrog>
Hmm. Yeah, for that you could force the user to name it, and then save it seperately so it can be re-used
02:05
<+Consul>
Shipped with the program, so to speak.
02:05
<@Derakon>
I'd say instead you make the entire function aspect extendable.
02:05
<@ToxicFrog>
In which case it follows the same pattern as the canned ones
02:05
<@ToxicFrog>
Derakon: it isn't already?
02:06
<@Derakon>
So there'd be a control panel where you could add new scripts and assign them names and lists of arguments; you could use those functions later and associate them with sliders, etc.
02:06
<@Derakon>
Yeah, sounds like I just said what you said.
02:06
<@ToxicFrog>
Yeah, that's what we're describing
02:07
<@ToxicFrog>
So that gives it the same save/load behaviour as the canned scripts: it saves a marker that remembers the name of the function and the parameters of this instance, and the function itself is stored elsewhere
02:07
<@ToxicFrog>
All of them, of course, with source code for later editing
02:07
<+Consul>
I'm also imagining a system where parameters for script behavior can be set as keyframes, like we talked about before.
02:08
<@ToxicFrog>
Those are just simple start/end values, typically
02:08
<+Consul>
A beginning point, and end point, and then a controller that describes how to get from one to the other (timer, another controller, another script, etc.).
02:08
<@ToxicFrog>
Just another set of parameters to the function
02:08
<@ToxicFrog>
Right, my point is, we pretty much already have this in the design
02:08
<+Consul>
And then the "setting" of the key points would just be UI stuff.
02:09
<@ToxicFrog>
Anyways, the keyframes thing is entirely a UI aspect
02:09
<@ToxicFrog>
The actual code looks the same ither way
02:12
<+Consul>
So, our layers are: GUI <=> Lua <=> Core engine (which is dumb).
02:13
<+Consul>
Lua forming the basis for the "smart wrapper" we discussed earlier.
02:13
<@ToxicFrog>
Looks like it
02:13
<@ToxicFrog>
The core probably doesn't even need to know anything about lua
02:13
<+Consul>
Yeah, it's just function called at that point.
02:14
<@ToxicFrog>
But Lua needs to know about it - configures it, plugs in all the (notional) wires, and pulls the lever
02:14
<+Consul>
The core will likely be a directed graph, where N samples of output are asked for (64, say), and the parameters controlling the behavior of each node in the graph is a signal like any other.
02:15
<+Consul>
So, Lua will need to be able to operate at the sample rate, but it won't be intensive stuff, like convolution.
02:15
<+Consul>
Or...
02:15
<@ToxicFrog>
It should mostly be simple get/set of variables and small expression evaluation, I should think
02:15
<+Consul>
I suppose we *could* create a separate control rate, but I really wanted to avoid that.
02:16
<@ToxicFrog>
Don't worry about speed until you know it's not fast enough.
02:16
<+Consul>
Well, the thing is... Say we have a fram size of 64 samples...
02:16
<+Consul>
frame*
02:16
<+Consul>
So, we ask the core for output, and out comes a pointer to 64 samples of it.
02:17
<+Consul>
Now, let's say the preset involves modulating the filter cutoff, a very common thing to do in any synth.
02:17
<+Consul>
That modification to the filter's parameters can't be happening only once every 64 samples. You'd hear serious zipper noise.
02:18
<+Consul>
See where I'm getting at?
02:19
<@ToxicFrog>
It has to happen every sample, yes?
02:19
<+Consul>
Yes
02:20
<+Consul>
The Csound guys discovered once out of every 10 samples will also work well enough for most, but not all, applications (physical modeling is a notable one which needs sample granularity).
02:21
<@ToxicFrog>
So if you needed a seperate control rate it would be something like "every N samples"?
02:21
<@ToxicFrog>
That shouldn't be hard to add. Set it to 1 to start with.
02:22
<@ToxicFrog>
If it turns out to be a problem, easy enough to either make it configurable or look at optimizing the control systems.
02:22
<+Consul>
Well, the engine will treat everything as a "one sample per change" thing, no control rate.
02:22
<+Consul>
But that doesn't mean the Lua function has to recalculate itself that fast.
02:23
<+Consul>
It can just cache its output, then recalculate every N times/.
02:26
<+Consul>
The other point is that Lua doesn't have to be used on every single parameter. If it's not needed, just have the widget send out its value every sample and the core engine will use that.
02:28
<@ToxicFrog>
Yeah
02:28
<@ToxicFrog>
Constant values can easily be cached in c/space
02:28
<+Consul>
Until the widget is touched.
02:28
<+Consul>
I'm coming around to this whole idea.
02:28
<+Consul>
Now I just need to learn Lua. :-)
02:28
<+Consul>
I was having a hard enough time with C++...
02:29
<@ToxicFrog>
Lua is small and easy to learn.
02:29
<@ToxicFrog>
Also, unlike C++, you do not need to taff about with:
02:30
<@ToxicFrog>
- manual memory management
02:30
<@ToxicFrog>
- preprocessing and compiling
02:30
<@ToxicFrog>
- headers
02:30
<@ToxicFrog>
- explicit pointers
02:31
<@ToxicFrog>
(well, for the language itself, anyways; the C<->Lua interface, being written in C, will still involve such things.)
02:31
<@ToxicFrog>
It also has an interactive mode. You would not believe how much this helps.
02:31
<+Consul>
Yeah, I'll need to figure out how to best integrate it.
02:32
<@ToxicFrog>
First step is probably just the configuration system - the ability to save, load, and edit sets of key/value pairs.
02:32
<+Consul>
I guess there is a way to do it in C++, but I've been focusing on Lua itself first.
02:33
<@ToxicFrog>
Er
02:33
<@ToxicFrog>
You kind of have to do it in C++; if C++ and Lua are to be able to talk to each other, you need C++ code supporting this
02:34
<@ToxicFrog>
Or am I misunderstanding what you mean by "integrate" here?
02:34
<@ToxicFrog>
But yes - focusing on Lua first is wise, since trying to binding the language into your C++ code without knowing the language would probably go badly.
02:34
<+Consul>
I probably used the term wrong.
02:34
<+Consul>
But yes, what I mean is, make Lua available to my C++ program.
02:34
<@ToxicFrog>
Right.
02:35
<+Consul>
Which is reportedly more difficult than making it work within a C program.
02:35
<@ToxicFrog>
It is?
02:35
<@ToxicFrog>
#include <lua.hpp>
02:35
<@ToxicFrog>
...use lua just as you would in a C program...
02:35
<+Consul>
Well, it could be the mailing list posts I hunted down didn't know what they were talking about...
02:35
<@ToxicFrog>
There, done.
02:35
<@ToxicFrog>
Or that they were talking about specific uses of it.
02:36
<@ToxicFrog>
For example, binding a C++ class to Lua, so that Lua can call methods on C++ objects of that class.
02:36
<+Consul>
That does sound familiar...
02:36
<@ToxicFrog>
That's harder than the C equivalent, since you can't export methods to lua directly (you lose this), you need to export statics which act as go-betweens.
02:36 Attilla [~The.Attil@92.8.104.ns-27184] has quit [Ping Timeout]
02:36
<@ToxicFrog>
But not much harder.
02:37
<@ToxicFrog>
Basically: manipulating Lua from C++ is the same as in C; exporting of functions and simple data structures (arrays, structs) to Lua from C++ is the same as C.
02:37
<+Consul>
So, my engine code would need to be callable from Lua, right?
02:37
<@ToxicFrog>
Exporting C++ classes to Lua is not the same, what with C not having classes in the first place, and has some potential gotchas you need to be aware of.
02:38
<@ToxicFrog>
But once you understand how it actually works it's pretty easy.
02:41
<+Consul>
What does it mean to "export" a function or a class to Lua? Is that what you have to do for the function to be callable *by* Lua, or is there some other magic happening?
02:41
<@ToxicFrog>
The former, pretty much. Exporting a function to lua == making a C or C++ function callable by lua directly.
02:42
<@ToxicFrog>
Exporting a class implies more completeness: the ability for Lua to instantiate objects of that class and call methods on it (all of which call into C++ to do the actual work).
02:42
<+Consul>
Ah, so my core engine *would* have to do that, then. Meaning it does have to be Lua aware, right?
02:42
<@ToxicFrog>
(in some cases - like SupComm - they go so far as to permit Lua to subclass C++ classes)
02:43
<@ToxicFrog>
Umm. Something has to be Lua aware, it doesn't necessarily have to be the core engine.
02:43 Attilla [~The.Attil@92.2.73.ns-20413] has joined #code
02:43 mode/#code [+o Attilla] by ChanServ
02:43
<@ToxicFrog>
You could, for example, write a simple interface that bridges the two, exposing the necessary parts of the core to lua, while keeping the core itself pure C++ with no external depencencies.
02:43
<+Consul>
Oh, I could export an object that simply passes calls on to the core engine.
02:44
<@ToxicFrog>
Exactly.
02:44
<@ToxicFrog>
That's all you'd be doing in any case, really
02:44
<+Consul>
Okay, I see how this can work, now.
02:44
<@ToxicFrog>
Unless you wanted to make objects in the core memory-managed by lua (and thus subject to garbage collection, etc) which is a pretty major win in some cases, but not, I suspect, here.
02:45
<@ToxicFrog>
(and even if you did, you could make the interface later export a proxy object with a destructor that deletes the *real* object)
02:45
<+Consul>
Yeah, the inner DSP loop needs to be pretty clean and fast.
02:45
<+Consul>
In fact, I've discovered that real-time programming actually uses a lot of what might be called bad practices othewrwise, in the name of speed.
02:46
<+Consul>
Things like not splitting repetitive code out into functions, etc.
02:47
<@ToxicFrog>
Um
02:47
<@ToxicFrog>
That's what the inline keyword is for
02:48
<+Consul>
See, that's why I really shouldn't be the one coding this.
02:48
<+Consul>
But between me and one other person, we're all we've got. Nobody else seems to care.
02:48
<@MyCatVerbs>
ToxicFrog: egrerious macro abuse!
02:48
<+Consul>
You can bet your ass that they'll be happy to use it when we're done, though.
02:48
<@MyCatVerbs>
Consul: srsly, inlining FTW.
02:49
<@ToxicFrog>
Are you already familiar with inline, or shall I give you a quick rundown on it?
02:49
<+Consul>
Naw, I'll look it up when the time comes.
02:49
<@ToxicFrog>
It only takes a second to explain anyways.
02:49
<+Consul>
Go for it, then. :-)
02:49
<@ToxicFrog>
If a function is declared inline, the compiler will not generate actual function calls; instead, it splices the code in directly.
02:50
<@ToxicFrog>
For example, inline int add(int a, int b) { return a+b; }
02:50
<@ToxicFrog>
If you call add(1,2) the compiler will emit the same code as though you had just written "a+b" there.
02:50
<@ToxicFrog>
This is roughly equivalent to:
02:50
<@ToxicFrog>
#define add(a,b) (a+b)
02:50
<@MyCatVerbs>
Except when the function's really short and nonrecursive and the compiler does it anyway, without needing the keyword, because you turned -O2 or -O3 on and it doesn't feel like acting like a damn fool today.
02:51
<@MyCatVerbs>
Which happens approximately... all the damn time. ^^
02:51
<@ToxicFrog>
Except it's handled at the compile stage, rather than the preprocessor stage, and it'll play nice with more IDEs and the like than #defines will.
02:51
<@ToxicFrog>
As MCV says, the compiler will often inline code anyways if you've told it to optimize for speed.
02:51
<@ToxicFrog>
However, the inlien keyword gives you a way to ensure that a function will be inlined no matter what optimization settings you use.
02:52
<@MyCatVerbs>
Oh and nasty #include hacks are even worse than they sound, because of side-effectful expressions.
02:52
<+Consul>
We're designing the inner DSP core to allow nodes in the graph to be code compiled from FAUST, which is a functional audio DSP language which compiled to optimized C++.
02:52
<+Consul>
compiles*
02:52
<@MyCatVerbs>
Hah. i can has inlien funktun?!
02:52
<@ToxicFrog>
Consul: oh, so it is the FAUST-emitted code that's not following best practices? That's totally reasonable.
02:52
<@ToxicFrog>
Since that code isn't meant to be touched by humans anyways.
02:53
<+Consul>
ToxicFrog: Exactly.
02:53
<@MyCatVerbs>
Consider, for shits and giggles: #define SQUARE(x) ((x)*(x)) -- ask yourself what happens when you write SQUARE(x++); :)
02:53
<@MyCatVerbs>
Consul: yeah, machine-emitted C is allowed to be made up entirely of labels and goto statements for all anyone cares.
02:53
<+Consul>
MyCatVerbs: I started working through the logic, and now my head hurts.
02:54
<@MyCatVerbs>
Bonus points if it is, actually, 'cuz that's often a good sign that someone probably used SSA. ;P
02:54
<@ToxicFrog>
It's not that hard.
02:54
<+Consul>
Yeah, FAUST does everything for the sake of efficient code.
02:54
<@ToxicFrog>
Do the substitution: ((x++)*(x++))
02:54
<+Consul>
ah, okay!
02:54
<+Consul>
I was thinking too much.
02:55
<@MyCatVerbs>
Consul: almost certainly that is not what the person using the SQUARE wanted, aye?
02:55
<+Consul>
Indeed.
02:57
<@McMartin>
Not only that, in C++ it isn't even properly defined if x is a class that overloads operator* nonsymmetrically!
02:57
<+Consul>
So, getting back to Lua and presets for a second, I just need to make sure I understand...
02:57
<@McMartin>
But now, dinner.
02:57
<+Consul>
Because I have to sell this to one other.
02:58
<+Consul>
Lua stores key=>value data in an internal table...
02:58
<+Consul>
And it's able to directly export that table to a file?
03:00
<+Consul>
Or there's otherwise an easy way to do so?
03:00
<@MyCatVerbs>
Yes, it's trivial to marshall Lua data structures to plaintext formats.
03:01
<+Consul>
Sweet, thanks!
03:01
<+Consul>
And just as trivial to load it again, I assume.
03:02
<@ToxicFrog>
More trivial to load it again.
03:03
<@ToxicFrog>
Saving it requires you to actually write a function to walk the table and write it to disk; a simple one is perhaps five lines, a more robust one 20+.
03:03
<@ToxicFrog>
(or you can use a predefined one)
03:03
<@ToxicFrog>
Loading it is a single function call.
03:03
<+Consul>
Cool...
03:04
<@ToxicFrog>
So, yes. It stores key=>value pairs in tables. You can have as many tables as you want, you can easily iterate over them and get/set them from C++, you can easily save and load them, and keys and values can be anything you want, including strings, numbers, pointers to C/++ objects, Lua functions, etc
03:04
<+Consul>
BRB
03:15
<@ToxicFrog>
"Yup, I totally tried to have a lava fall running through the center of my meeting hall, dropping into an area for my forges... it was all going perfectly until I noticed dwarves burning to death and the 'basement' slowly filling with lava."
03:21
<+Consul>
Argh. Google Groups' web interface would have to error out right at this moment...
03:23
<+Consul>
OKay, it finally posted...
03:37 Attilla [~The.Attil@92.2.73.ns-20413] has quit [Quit: <Insert Humorous and/or serious exit message here>]
04:25 crem [~moo@93.84.92.ns-3508] has joined #code
04:25 Vornicus [~vorn@Admin.Nightstar.Net] has joined #code
04:25 mode/#code [+o Vornicus] by ChanServ
05:21 crem [~moo@93.84.92.ns-3508] has quit [Connection reset by peer]
05:22 crem [~moo@93.84.92.ns-3508] has joined #code
05:27 crem [~moo@93.84.92.ns-3508] has quit [Ping Timeout]
05:31 AFKSkull [~none@Nightstar-7066.dyn.optonline.net] has left #code []
05:33 crem [~moo@93.84.89.ns-5013] has joined #code
05:41 crem [~moo@93.84.89.ns-5013] has quit [Connection reset by peer]
05:41 crem [~moo@93.84.89.ns-5013] has joined #code
05:55 crem [~moo@93.84.89.ns-5013] has quit [Ping Timeout]
06:00 AnnoDomini [AnnoDomini@Nightstar-29598.neoplus.adsl.tpnet.pl] has joined #Code
06:01 mode/#code [+o AnnoDomini] by ChanServ
06:03 crem [~moo@93.84.93.ns-3789] has joined #code
06:44 crem_ [~moo@93.84.90.ns-3424] has joined #code
06:45 crem [~moo@93.84.93.ns-3789] has quit [Ping Timeout]
06:59 Derakon is now known as Derakon[AFK]
07:01 crem_ [~moo@93.84.90.ns-3424] has quit [Ping Timeout]
07:04 crem [~moo@Nightstar-28703.adsl.mgts.by] has joined #code
07:06 gnolam [lenin@Nightstar-2037.A163.cust.bahnhof.se] has joined #Code
07:06 mode/#code [+o gnolam] by ChanServ
07:33 You're now known as TheWatcher
07:56 gnolam [lenin@Nightstar-2037.A163.cust.bahnhof.se] has quit [Ping Timeout]
08:09 You're now known as TheWatcher[afk]
08:13 gnolam [lenin@Nightstar-2037.A163.cust.bahnhof.se] has joined #Code
08:13 mode/#code [+o gnolam] by ChanServ
08:36 crem [~moo@Nightstar-28703.adsl.mgts.by] has quit [Connection reset by peer]
08:36 crem [~moo@Nightstar-28703.adsl.mgts.by] has joined #code
10:27 Reiver [~reaverta@Admin.Nightstar.Net] has quit [Ping Timeout]
10:33 Reiver [~reaverta@Admin.Nightstar.Net] has joined #Code
10:33 mode/#code [+o Reiver] by ChanServ
10:48 You're now known as TheWatcher
11:17 Attilla [~The.Attil@92.2.73.ns-20413] has joined #code
11:17 mode/#code [+o Attilla] by ChanServ
11:23 Attilla [~The.Attil@92.2.73.ns-20413] has quit [Ping Timeout]
11:32 Brother_Willibald [lenin@Nightstar-2037.A163.cust.bahnhof.se] has joined #Code
11:32 gnolam is now known as NSGuest-470
11:32 Brother_Willibald is now known as gnolam
11:33 NSGuest-470 [lenin@Nightstar-2037.A163.cust.bahnhof.se] has quit [Ping Timeout]
11:39 Attilla [~The.Attil@92.2.73.ns-20413] has joined #code
11:39 mode/#code [+o Attilla] by ChanServ
11:41 Kazriko [~kaz@Nightstar-26352.gdj-co.client.bresnan.net] has quit [Client exited]
11:46 Kazriko [~kaz@Nightstar-26352.gdj-co.client.bresnan.net] has joined #code
11:46 mode/#code [+o Kazriko] by ChanServ
12:14 Attilla [~The.Attil@92.2.73.ns-20413] has quit [Ping Timeout]
12:15 Attilla [~The.Attil@92.2.73.ns-20413] has joined #code
12:15 mode/#code [+o Attilla] by ChanServ
13:37 Thaqui [~Thaqui@Nightstar-13764.jetstream.xtra.co.nz] has left #code [MORE constitution LESS destitution MORE pros...perity.]
14:58 You're now known as TheWatcher[afk]
16:53 gnolam [lenin@Nightstar-2037.A163.cust.bahnhof.se] has quit [Ping Timeout]
16:54 Shoukanjuu [~Shoukanju@Nightstar-27098.101.8.67.cfl.res.rr.com] has quit [Ping Timeout]
17:02 gnolam [lenin@Nightstar-2037.A163.cust.bahnhof.se] has joined #Code
17:02 mode/#code [+o gnolam] by ChanServ
17:07 Reiver [~reaverta@Admin.Nightstar.Net] has quit [Ping Timeout]
17:11 gnolam [lenin@Nightstar-2037.A163.cust.bahnhof.se] has quit [Ping Timeout]
17:14 Reiver [~reaverta@Admin.Nightstar.Net] has joined #Code
17:14 mode/#code [+o Reiver] by ChanServ
17:46 * ToxicFrog kicks C++ in the balls over and over again
17:52
<@ToxicFrog>
It should not be this difficult to dynamically generate the number of arguments to a function at runtime!
17:59
<@Vornicus>
ah, good times.
18:03 AnnoDomini is now known as Greenbeard
18:04
<@ToxicFrog>
And by "difficult" I mean "impossible", since the function takes ... rather than va_list
18:04
<@ToxicFrog>
Barring stupid pointer tricks that I'm very reluctant to use.
18:04
<@Vornicus>
:(
18:05
<@ToxicFrog>
Really, this whole stats framework kind of falls apart when you need to dynamically generate both the number of stats and their names, and C++ is not being helpful.
18:11
<@Vornicus>
Kill.
18:14
<+Consul>
Normally, since C++ is the compiled language of my choice, I would jump to its defense. However, I only hate it a little less than others, so I don't feel compelled defend it at all, really.
18:16
<+Consul>
In fact, I often want to stab it with a brick.
18:36
<@ToxicFrog>
In this case, I have a data structure that defines the display formats of a bunch of stats, a function call that generates a format string from that, and a CK_Snprintf() call that expects to be passed the format string and the actual numbers that make up the stats.
18:37
<@ToxicFrog>
Unfortunately, the names of the stats are generated at runtime, and while the number of stats is technically determinable at compile time it would be really nice to be able to do it at runtime.
18:45 You're now known as TheWatcher
19:34
<+Consul>
Heck with it. I'm just gonna go ahead, research and build the Lua stuff I want for my synth and sampler. I'm tired of having conversations with myself on our public mailing list.
19:36
<@ToxicFrog>
Froth
19:36
<@ToxicFrog>
Is there any way to do iteration in cpp?
19:36 jerith [~jerith@IRCop.Nightstar.Net] has quit [Ping Timeout]
19:37 jerith [~jerith@Nightstar-21563.slipgate.za.net] has joined #code
19:37
<@ToxicFrog>
Consul: as far as the lua stuff goes, useful resources -
19:37
<@ToxicFrog>
www.lua.org/manual/5.1/ -- the reference manual
19:37
<+Consul>
I'm already reading that one. :-)
19:38
<@ToxicFrog>
www.lua.org/pil/ -- an introductory text (now somewhat out of date, but still useful in places)
19:38
<@ToxicFrog>
www.lua-users.org/wiki/ -- the wiki, full of tasty stuff
19:38
<+Consul>
And I do want to say that my partner in crime has done a bang-up job on the JACK and voice abstract classes.
19:38
<@ToxicFrog>
http://www.lua.org/lua-l.html -- the mailing list
19:39
<@ToxicFrog>
#lua on irc.freenode.org -- the official IRC channel
19:39
<+Consul>
There's an ITC channel in Freenode, too.
19:39
<+Consul>
IRC I mean
19:39
<@ToxicFrog>
Yes, I'm in it :P
19:41
<+Consul>
But putting Lua in between incoming MIDI/OSC and the engine opens up a lot of ideas.
19:42
<+Consul>
Suddenly, things like velocity layers, velocity crossfading, and positional crossfading can be scripted.
19:45
<+Consul>
Now I just need to figure out a clean way of creating that functionality.
19:46 Attilla [~The.Attil@92.2.73.ns-20413] has quit [Ping Timeout]
19:47 Attilla [~The.Attil@92.17.251.ns-11974] has joined #code
19:47 mode/#code [+o Attilla] by ChanServ
20:02
<@ToxicFrog>
Consul: I again suggest starting with the KV load/save functionality
20:02
<@ToxicFrog>
It's simple to design, it's simple to implement, it'll give you some familiarity with the language and how it interfaces with C++, and it can easily be built on.
20:35
<+Consul>
ToxicFrog: Sounds like a good plan to me.
20:47 Greenbeard [AnnoDomini@Nightstar-29598.neoplus.adsl.tpnet.pl] has quit [Ping Timeout]
20:54 AnnoDomini [AnnoDomini@Nightstar-29533.neoplus.adsl.tpnet.pl] has joined #Code
20:54 mode/#code [+o AnnoDomini] by ChanServ
21:54 You're now known as TheWatcher[t-2]
21:56 You're now known as TheWatcher[zZzZ]
22:51 androsch [~androsch@Nightstar-2639.pools.arcor-ip.net] has joined #code
23:02 AnnoDomini [AnnoDomini@Nightstar-29533.neoplus.adsl.tpnet.pl] has quit [Quit: No fighting in the War Room!]
23:07 jerith [~jerith@Nightstar-21563.slipgate.za.net] has quit [Ping Timeout]
23:07 jerith [~jerith@Nightstar-21563.slipgate.za.net] has joined #code
--- Log closed Sat Aug 09 00:00:30 2008
code logs -> 2008 -> Fri, 08 Aug 2008< code.20080807.log - code.20080809.log >