introducing: 'grid studies' & education discounts

  • we've created a series of 'grid studies', covering 7 coding environments, designed to help integrate the grid into your software of choice. a small amount of experience in each given language is required, though these can also serve as a basic introduction into a number of different environments.

    languages covered: arduino, max, node.js, pd, processing, python and supercollider.

    each study is based around the same general outline: installation & required libraries, connecting & communicating with the grid, introduction to decoupled interaction, and building a step-sequencer to trigger events (shown below).



    if you're already familiar with one language, it's a good idea to take that study in order to understand the general outline. this knowledge will then make each subsequent language much easier to grasp. this is a great way to take a quick introduction in a wide range of languages, highlighting the differences & similarities of each as you go.

    each tutorial will typically take around 45 minutes to complete, depending on familiarity with the language.

    all tutorials are open-source, so any and all ideas for improvement are encouraged with instructions on how to contribute at the end of each tutorial.


    http://monome.org/docs/grid-studies


    ///

    education discount

    the above grid studies are designed not only to enable artists & designers greater access to building their own tools, but also as a highly engaging method for learning or teaching code. to encourage this physical approach, we're now offering education discounts for current students of tertiary institutions.

    to receive 10% off your new grid (or grid kit) purchase, head to market.monome.org where you'll find a link & instructions for verifying your student status.

    in addition we're now offering institutional package pricing for grids, and are available to offer assistance for incorporating the grid into your curriculum. we also run 2-day workshops extending from the above introductory studies. please contact info@monome.org for further details and to discuss how we can best introduce the grids to your students.


    http://market.monome.org

  • THIS IS GREAT! saw it on github a couple nights ago and checked out the step sequencer tutorial. good work. :)

  • This is great. Kudos for doing this.

  • if they were more common
    it would also be cool to see arc studies...

    i'll check the SC guide assuming that it provides a decent foundation [esp regarding decoupled interaction]


    thanks for the work on these!

  • @raja

    thanks so much for your supercollider tutorial as it was how i learned how to actually make the sc part. i'd completely appreciate your hard critique as i'm sure it's not a best-practices example.

  • thank you so much for this, these are amazing.

  • Nice - I use my old greyscale at the community youth project where I teach electronic music. This is 12-17 year olds from all kinds of backgrounds, so we're talking Sum and MLRV, not supercollider! That said there are few things that get them as excited about music as the grid.

    Great initiative, people! This is sure to spread the blinkylight love to the next generations.

  • Very nice indeed! Thank you guys!
    (you're making it really hard to avoid a long ditched imminent upgrade though)

    @gli arc is basically the same, isn't it? instead of key presses there are +/- delta values to process. granted, there might be specific tricks to deal with them.

  • The education discount is great! I'm surprised I didn't ask about one when I bought my 256 - arc combo.

  • Cool stuff. Great to see more docs for the grid.

  • whoa, awesome, there's an SC tutorial! :D

  • Many many thanks for these !!! Good entry point in the arduino world for me, and even max tips !

  • great :)

  • looking forward to this, its come at a great time where I'm happy enough with basic Max patching to know roughly whats going on..

  • this is really excellent. good work all

  • this is so cool!!!!

  • a wonderful initiative!

    now who wants to write the chuck tutorial? :)

  • we're open to contributed tutorials given they follow the form and implement the same step sequencer as a reference point.

    we use MacDown for the markdown rendering with syntax highlighting.

  • This is excellent, and the timing is spot on as I've been itching to take a look at pymonome, and now there's a nice tutorial. Thanks guys!

  • i should've mentioned this earlier.

    huge thanks to several people for making these tutorials happen:

    @phortran: processing library, nodejs library, nodejs tutorial
    @artfwo: python library, python step sequencer adaptation
    @zebra: arduino library
    @galapagoose: pd tutorial and proofing

  • and, most importantly!

    getting these together required writing new libraries for many of these languages-- so this project represents new ease in using grids with each language.

  • this last point! for anyone using pd in particular, the tutorial includes a new serialosc abstraction that automates the whole connection process! just drop it in your patch and it'll talk to your device directly.

  • Nice and concise. Arduino - ill have look at as well as Processing (weapon of choice). Can you give the tech spec reason why the Due is the only one to work for Arduino ? Is it usb host ?

  • I've been thinking of getting into monome and buying one of the new grids. does the grid work well with the csound language? (or at all? there doesn't seem to be much csound talk in this forum). any chance of a grid study for csound?

  • Hello!

    Just a trouble shooting question! Do I require a full max 6 or 7 license to be able to replicate/ follow the max study? I'm able to get full action via max runtime but when I try to replicate objects etc using my Max for Live license Via Live, no communication is happening between Max and Monome, no button or led action at all!

    Max frustration!!
    Any insights are very much required!

    Cheers

  • we'll have to look into csound!

    arduino hardware with USB HOST should work. i think the DUE is the only one at this point but i could be wrong.

    max for live hasn't been tested at this point. if you'd like to start a new thread with your issue, we can look into it.

  • I am just putting the finishing touches for the first release of a Monome library for Go. I'd be up for making a grid study as well, would be a good way to validate the library :) Currently I've ported over and modified some of the examples from @artfwo's Python library.

  • :o wonderful work people, thank you!

  • @tehn arudino mega ADK has that mode as its for android/arduino dev. so in theory should work also.

  • "max for live hasn't been tested at this point. if you'd like to start a new thread with your issue, we can look into it."

    Has this thread been created? nothing came up using a google site search. I'm very interested in creating the step sequencer in m4l as I don't have max, and even if I did I would probably want to exclusively create m4l patches for the monome. Perhaps someone can use the bulk of the max lesson and add parts for it to work in m4l?

    Thanks!

  • on supercollider grid studies, i couldnt get visual feedback on monome, but sound/loop points are working -- i think its because i am using a non varibright monome (gs128)?

  • you get nothing at all? the brightest levels should certainly be displayed.

  • same here with my GS 64.No error messages,but no led feedback,except for the first example file.

  • will check this, sorry for the trouble!

  • Hello all, I just want to confirm that arduinome (non varibrightness) (+ supercollider) doesn't understand none of the 'lev~' related arguments (levset levall levrow levcol levmap).

    Most examples in the tutorial use 'levset' (actually, all of them except the first one). While I get no errors, and the function is there, I get no light.
    Changing the code is easy. I will post one example, just in case a newbie like me finds it and hopefully saves some time... unlike me, lol

    in the code bellow (grid-studies-2-4.scd example)
    find the line "~m.levset(x,y,~step[y*16+x] * 15);"
    replace it with "~m.ledset(x,y,~step[y*16+x]);"
    and should work just fine.

    You can modify the rest of the examples accordingly to get them working. Hope this helps.

    (
    Server.default = Server.local;
    ~m = MonoM.new("/monome", 0);
    s.waitForBoot({
    ~step = Array.fill(128, {0});
    ~m.useDevice(0);
    OSCFunc.newMatching(
    { arg message, time, addr, recvPort;

    if(message[3] == 1, {
    var pos = message[1] + (message[2] * 16);
    if(~step[pos] == 1,
    {~step[pos] = 0},
    {~step[pos] = 1}
    );
    d.value;
    })
    }, "/monome/grid/key");
    d = {
    for(0,7, {arg y;
    for(0,15, {arg x;
    ~m.levset(x,y,~step[y*16+x] * 15);
    })
    })
    };
    });
    )

  • i've had another report of this and need to test. what specific grid are you using?

  • tried here changing levset to ledset. ledset needs 0 or 1 argument. i dont know if i made some mistake but now seems that it's working - but i cant understand well what row 6 is doing... showing triggers? i am using a gs128 here...

    grid-studies-3-5.scd

    (
    Server.default = Server.local;

    SynthDef(\singrain, { |freq = 440, amp = 0.2, sustain = 1|
    var sig;
    sig = SinOsc.ar(freq, 0, amp) * EnvGen.kr(Env.perc(0.01, sustain), doneAction: 2);
    Out.ar(0, sig ! 2); // sig ! 2 is the same as [sig, sig]
    }).add;

    ~m = MonoM.new("/monome", 0);

    s.waitForBoot({

    ~step = Array.fill(96, {0});
    ~play_position = 0;
    ~next_position = 0;
    ~cutting = 0;
    ~keys_held = 0;
    ~key_last = 0;
    ~loop_start = 0;
    ~loop_end = 15;

    ~m.useDevice(0);

    OSCFunc.newMatching(
    { arg message, time, addr, recvPort;

    // toggles
    if((message[3] == 1) && (message[2] < 6), {
    var pos = message[1] + (message[2] * 16);
    if(~step[pos] == 1,
    {~step[pos] = 0},
    {~step[pos] = 1}
    );
    });

    // count bottom row keys
    if(message[2] == 7,
    if(message[3] == 1,
    {~keys_held = ~keys_held + 1;},
    {~keys_held = ~keys_held - 1;});
    );

    // loop and cut
    if((message[3] == 1) && (message[2] == 7), {
    if(~keys_held == 1, {
    ~next_position = message[1];
    ~cutting = 1;
    ~key_last = message[1];
    },
    {
    ~loop_start = ~key_last;
    ~loop_end = message[1];
    ~loop_end.postln;
    });
    });
    }, "/monome/grid/key");


    d = {
    var highlight;
    for(0,15, {arg x;
    if(x==~play_position,
    {highlight = 1},
    {highlight = 0});

    for(0,5, {arg y;
    ~m.ledset(x,y,(~step[y*16+x]));
    });

    // set trigger row background
    ~m.ledset(x,6,0);

    // clear play position row
    ~m.ledset(x,7,0);
    });

    // play position
    ~m.ledset(~play_position,7,1);

    // show triggers
    for(0,5, {arg t;
    if(~step[(t*16) + ~play_position] == 1,
    {~m.ledset(t,6,1);}
    )
    });
    };

    t = Routine({
    var interval = 0.125;
    loop {
    // update position
    if(~cutting == 1,
    {~play_position = ~next_position; ~cutting = 0;},
    {
    if(~play_position == 15,
    {~play_position = 0;},
    {
    if(~play_position == ~loop_end,
    {~play_position = ~loop_start;},
    {~play_position = ~play_position + 1;});
    }
    );
    };
    );

    // TRIGGER SOMETHING
    for(0,5, {arg t;
    if(~step[(t*16) + ~play_position] == 1,
    {Synth(\singrain, [freq: (5-t)*100+300,
    amp: rrand(0.1, 0.5), sustain: interval * 0.8]);}
    )
    });

    d.value;

    interval.yield;
    }

    });

    t.play();

    });

    )

  • @tehn I am using an arduinome made back in 2009 (40h clone & it is flashed with the latest firmware of 2012). I am in the process of modifying all of the examples anyway, for my personal use, so, I could maybe send you all of them to observe, if it helps.

    @igormpc I am still in the grid-studies-3-3.scd example, but I will rush to grid-studies-3-5.scd asap. As I advance to the examples it gets trickier to modify them.

  • @igormpc your code works just fine, I can confirm this on 64 buttons arduinome too.

    Row 6 button 1 feedback any trigger happening in the first row, button 2 feedback any trigger going on in row 2 etc IMO Row 6 is just a feedback demonstration as part of the tutorial, doing nothing important, but tutorial-wise makes sense to be there. Or maybe with the variable brightness feature makes more sense, if not practically, at lease visually.