11. DONE Step Runt Words
CLOSED: [2019-02-24 Sun 14:17]
11.1. DONE Step Runt Loader
CLOSED: [2019-02-23 Sat 12:22]
All runt words are loaded with the function step_runt_loader. It is loaded
at init time.
static int step_runt_loader(monolith_d *m);<<step_runt_functions>>
static int step_runt_loader(monolith_d *m)
{
<<step_runt_keywords>>
    monolith_runt_mark_set(m);
    return RUNT_OK;
}step_runt_loader(m);11.2. DONE stepclk
CLOSED: [2019-02-23 Sat 11:46]
The stepclk node is a special node that intends to be called exactly once in
a signal chain. This node takes in a clock signal from a unit generator such as
metro or clock, and then uses that as the clock source of the step generator.
monolith_runt_keyword(m, "stepclk", 7, rproc_stepclk, m);static int rproc_stepclk(runt_vm *vm, runt_ptr p)
{
    int rc;
    rgf_param in;
    gf_patch *patch;
    gf_node *node;
    const char *name;
    monolith_d *m;
    monolith_page *pg;
    runt_stacklet *s;
    page_step_d *step;
    rc = runt_ppop(vm, &s);
    RUNT_ERROR_CHECK(rc);
    name = runt_to_string(s->p);
    rc = rgf_get_param(vm, &in);
    RUNT_ERROR_CHECK(rc);
    m = runt_to_cptr(p);
    patch = monolith_graforge_get(m);
    rc = runt_monolith_lookup_page(vm, m, name, "step", is_step, &pg);
    RUNT_ERROR_CHECK(rc);
    step = monolith_page_data_get(pg);
    rc = gf_patch_new_node(patch, &node);
    GF_RUNT_ERROR_CHECK(rc);
    node_stepclk(node, step);
    rgf_set_param(vm, node, &in, 0);
    return RUNT_OK;
}11.3. DONE stepnt
CLOSED: [2019-02-23 Sat 12:48]
stepnt is a node that outputs the current note signal based on the current
clock position.
monolith_runt_keyword(m, "stepnt", 6, rproc_stepnt, m);static int rproc_stepnt(runt_vm *vm, runt_ptr p)
{
    int rc;
    gf_patch *patch;
    gf_node *node;
    const char *name;
    monolith_d *m;
    monolith_page *pg;
    runt_stacklet *s;
    page_step_d *step;
    runt_stacklet *out;
    rc = runt_ppop(vm, &s);
    RUNT_ERROR_CHECK(rc);
    name = runt_to_string(s->p);
    rc = runt_ppush(vm, &out);
    RUNT_ERROR_CHECK(rc);
    m = runt_to_cptr(p);
    patch = monolith_graforge_get(m);
    rc = runt_monolith_lookup_page(vm, m, name, "step", is_step, &pg);
    RUNT_ERROR_CHECK(rc);
    step = monolith_page_data_get(pg);
    rc = gf_patch_new_node(patch, &node);
    GF_RUNT_ERROR_CHECK(rc);
    node_stepnt(node, step);
    rgf_push_output(vm, node, out, 0);
    return RUNT_OK;
}11.4. DONE stepgt
CLOSED: [2019-02-23 Sat 13:11]
stepgt is a node which outputs the current gate signal based on the current
position.
monolith_runt_keyword(m, "stepgt", 6, rproc_stepgt, m);static int rproc_stepgt(runt_vm *vm, runt_ptr p)
{
    int rc;
    gf_patch *patch;
    gf_node *node;
    const char *name;
    monolith_d *m;
    monolith_page *pg;
    runt_stacklet *s;
    page_step_d *step;
    runt_stacklet *out;
    rc = runt_ppop(vm, &s);
    RUNT_ERROR_CHECK(rc);
    name = runt_to_string(s->p);
    rc = runt_ppush(vm, &out);
    RUNT_ERROR_CHECK(rc);
    m = runt_to_cptr(p);
    patch = monolith_graforge_get(m);
    rc = monolith_lookup_page(m, &pg, name, strlen(name));
    if(!rc) {
        runt_print(vm, "Could not find page '%s'\n", name);
        return RUNT_NOT_OK;
    }
    if(!is_step(pg)) {
        runt_print(vm, "Page '%s' is not a step page\n", name);
        return RUNT_NOT_OK;
    }
    step = monolith_page_data_get(pg);
    rc = gf_patch_new_node(patch, &node);
    GF_RUNT_ERROR_CHECK(rc);
    node_stepgt(node, step);
    rgf_push_output(vm, node, out, 0);
    return RUNT_OK;
}11.5. DONE stepplay
CLOSED: [2019-02-24 Sun 14:17]
stepplay is a node which outputs a gate signal inidicating if the page
is playing or not.
monolith_runt_keyword(m, "stepplay", 8, rproc_stepplay, m);static int rproc_stepplay(runt_vm *vm, runt_ptr p)
{
    int rc;
    gf_patch *patch;
    gf_node *node;
    const char *name;
    monolith_d *m;
    monolith_page *pg;
    runt_stacklet *s;
    page_step_d *step;
    runt_stacklet *out;
    rc = runt_ppop(vm, &s);
    RUNT_ERROR_CHECK(rc);
    name = runt_to_string(s->p);
    rc = runt_ppush(vm, &out);
    RUNT_ERROR_CHECK(rc);
    m = runt_to_cptr(p);
    patch = monolith_graforge_get(m);
    rc = runt_monolith_lookup_page(vm, m, name, "step", is_step, &pg);
    RUNT_ERROR_CHECK(rc);
    step = monolith_page_data_get(pg);
    rc = gf_patch_new_node(patch, &node);
    GF_RUNT_ERROR_CHECK(rc);
    node_play(node, step);
    rgf_push_output(vm, node, out, 0);
    return RUNT_OK;
}11.6. TODO stepstep
monolith_runt_keyword(m, "stepstep", 8, rproc_stepstep, m);static int rproc_stepstep(runt_vm *vm, runt_ptr p)
{
    int rc;
    gf_patch *patch;
    gf_node *node;
    const char *name;
    monolith_d *m;
    monolith_page *pg;
    runt_stacklet *s;
    page_step_d *step;
    rgf_param in;
    rc = runt_ppop(vm, &s);
    RUNT_ERROR_CHECK(rc);
    name = runt_to_string(s->p);
    rc = rgf_get_param(vm, &in);
    RUNT_ERROR_CHECK(rc);
    m = runt_to_cptr(p);
    patch = monolith_graforge_get(m);
    rc = monolith_lookup_page(m, &pg, name, strlen(name));
    if(!rc) {
        runt_print(vm, "Could not find page '%s'\n", name);
        return RUNT_NOT_OK;
    }
    if(!is_step(pg)) {
        runt_print(vm, "Page '%s' is not a step page\n", name);
        return RUNT_NOT_OK;
    }
    step = monolith_page_data_get(pg);
    rc = gf_patch_new_node(patch, &node);
    GF_RUNT_ERROR_CHECK(rc);
    node_step(node, step);
    rgf_set_param(vm, node, &in, 0);
    return RUNT_OK;
}prev | home | next