Browse Source

Completely re-made main patcher, tweaked js a bit (list output mode, few optimizations), added example patch

"
master
TFLCL 3 years ago
parent
commit
9b75067b39
  1. 131
      Cubehelix.js
  2. 3249
      Cubehelix.maxpat
  3. 468
      Cubehelix_example.maxpat

131
Cubehelix.js

@ -1,74 +1,129 @@
// Cubehelix color scheme for Max/MSP/Jitter
// By Théophile Clet - https://tflcl.xyz
// Based on Dave Green's work: http://www.mrao.cam.ac.uk/~dag/CUBEHELIX/cubetry.html
// Original publication: Green, D. A., 2011, `A colour scheme for the display of astronomical intensity images', Bulletin of the Astronomical Society of India, 39, 289. (2011BASI...39..289G at ADS.) ( http://astron-soc.in/bulletin/11June/289392011.pdf )
// Original js code taken straight from the online example implementation: http://www.mrao.cam.ac.uk/~dag/CUBEHELIX/cubetry.html
autowatch = 0;
// By Théophile Clet
// https://tflcl.xyz
//
// Based on Dave Green's work:
// http://www.mrao.cam.ac.uk/~dag/CUBEHELIX/cubetry.html
//
// Original publication: Green, D. A., 2011, `A colour scheme for the display of astronomical intensity images', Bulletin of the Astronomical Society of India, 39, 289. (2011BASI...39..289G at ADS.)
// http://astron-soc.in/bulletin/11June/289392011.pdf )
//
// Original js code taken straight from the online example implementation:
// http://www.mrao.cam.ac.uk/~dag/CUBEHELIX/cubetry.html
autowatch = 1;
inlets = 1;
outlets = 2;
outlets = 4;
var RGBOUTLET = 0;
var HSLOUTLET = 1;
var LISTOUTLET = 2
var DUMPOUTLET = 3;
setinletassist(0, "List as input: {makeCubehelixRGB, start[float], rots[float], sign[-1,1], hue[float], gamma[float], levels(int), flip([0,1]}")
setoutletassist(0, "To jit.matrix: outputs the color palette as a 4-plane 1 dim matrix");
setoutletassist(1, "dump out. Outputs paramters used for generation. Bangs when finished.");
setoutletassist(0, "To jit.matrix: always outputs the color palette as a ARGB 4-plane matrix");
setoutletassist(1, "To jit.matrix: if 'hslenable 1' outputs the color palette as a AHSL 4-plane matrix");
setoutletassist(2, "If 'listmode 1' outputs all colors in list format as RGB or HSL.");
setoutletassist(3, "Bangs when generation is done.");
function makeCubehelixRGB(start, rots, sign, hue, gamma, levels, flip){
rots = rots*sign;
var hslmode = false;
var listmode = false;
function hslenable(s){
hslmode = s;
}
function listenable(s){
listmode = s;
}
function makeCubehelix(start, rots, hue, gamma, levels, flip){
//dumpOut(start, rots, hue, gamma, levels, flip);
outlet(RGBOUTLET, "dim", levels, 1);
if (hslmode) {
outlet(HSLOUTLET, "dim", levels, 1);
}
outlet(0, "dim", levels, 1);
for (var i = 0; i < levels; i++) {
var fract = CubeHelixFract(i,levels,flip);
var red = CubeHelixRGB(fract,start,rots,hue,gamma,1);
var grn = CubeHelixRGB(fract,start,rots,hue,gamma,2);
var blu = CubeHelixRGB(fract,start,rots,hue,gamma,3);
var color = CubeHelixRGB(fract,start,rots,hue,gamma);
if(flip == 1){fract = 1.0-fract;}
outlet(0, "setcell", i, 0, "val", 1., red, grn, blu);
outlet(RGBOUTLET, "setcell", i, 0, "val", 1., color);
if (hslmode) {
color = rgb2hsl(color[0], color[1], color[2]);
outlet(HSLOUTLET, "setcell", i, 0, "val", 1., color);
}
if (listmode) { outlet(LISTOUTLET, i, color); }
}
outlet(0, "bang");
outlet(1, "bang");
outlet(RGBOUTLET, "bang");
if (hslmode) { outlet(HSLOUTLET, "bang"); }
if (listmode) { outlet(LISTOUTLET, "bang"); }
outlet(DUMPOUTLET, "bang");
}
function dumpOut(start, rots, hue, gamma, levels, flip){
outlet(1, "start", start);
outlet(1, "rots", rots);
outlet(1, "hue", hue);
outlet(1, "gamma", gamma);
outlet(1, "levels", levels);
outlet(1, "flip", flip);
outlet(DUMPOUTLET, "start", start);
outlet(DUMPOUTLET, "rots", rots);
outlet(DUMPOUTLET, "hue", hue);
outlet(DUMPOUTLET, "gamma", gamma);
outlet(DUMPOUTLET, "levels", levels);
outlet(DUMPOUTLET, "flip", flip);
}
function rgb2hsl(r,g,b) {
var max = Math.max(r, g, b), min = Math.min(r, g, b);
var h, s, l = (max + min) / 2;
if (max == min) {
h = s = 0; // achromatic
} else {
var d = max - min;
s = l > 0.5 ? d / (2 - max - min) : d / (max + min);
switch (max) {
case r: h = (g - b) / d + (g < b ? 6 : 0); break;
case g: h = (b - r) / d + 2; break;
case b: h = (r - g) / d + 4; break;
}
h /= 6;
}
return [ h, s, l ];
}
// ----------------------------------------------------------------------------
// 2017 May 30: make consistent with Fortran
// 2021 mai 12: a bit of calculation optimization (I think) - Théophile Clet
// ----------------------------------------------------------------------------
function CubeHelixRGB(fract,start,rots,hue,gamma,irgb){
function CubeHelixRGB(fract,start,rots,hue,gamma){
var angle = 2*Math.PI*(start/3.0+1+rots*fract);
var fract = Math.pow(fract, gamma);
var amp=hue*fract*(1-fract)/2.0;
var r=fract+amp*(-0.14861*Math.cos(angle)+1.78277*Math.sin(angle));
var g=fract+amp*(-0.29227*Math.cos(angle)-0.90649*Math.sin(angle));
var b=fract+amp*(+1.97294*Math.cos(angle));
r=Math.max(Math.min(r,1.0),0.0);
var g=fract+amp*(-0.29227*Math.cos(angle)-0.90649*Math.sin(angle));
g=Math.max(Math.min(g,1.0),0.0);
var b=fract+amp*(+1.97294*Math.cos(angle));
b=Math.max(Math.min(b,1.0),0.0);
if(irgb == 1){
return r;
}
else if(irgb == 2) {
return g;
}
else {
return b;
}
return [r, g, b];
}
// ----------------------------------------------------------------------------

3249
Cubehelix.maxpat

File diff suppressed because it is too large Load Diff

468
Cubehelix_example.maxpat

@ -0,0 +1,468 @@
{
"patcher" : {
"fileversion" : 1,
"appversion" : {
"major" : 7,
"minor" : 3,
"revision" : 6,
"architecture" : "x86",
"modernui" : 1
}
,
"rect" : [ 1198.0, 591.0, 578.0, 815.0 ],
"bglocked" : 0,
"openinpresentation" : 0,
"default_fontsize" : 12.0,
"default_fontface" : 0,
"default_fontname" : "Arial",
"gridonopen" : 1,
"gridsize" : [ 15.0, 15.0 ],
"gridsnaponopen" : 1,
"objectsnaponopen" : 1,
"statusbarvisible" : 2,
"toolbarvisible" : 1,
"lefttoolbarpinned" : 0,
"toptoolbarpinned" : 0,
"righttoolbarpinned" : 0,
"bottomtoolbarpinned" : 0,
"toolbars_unpinned_last_save" : 0,
"tallnewobj" : 0,
"boxanimatetime" : 200,
"enablehscroll" : 1,
"enablevscroll" : 1,
"devicewidth" : 0.0,
"description" : "",
"digest" : "",
"tags" : "",
"style" : "",
"subpatcher_template" : "",
"boxes" : [ {
"box" : {
"id" : "obj-38",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 462.0, 46.0, 70.0, 22.0 ],
"style" : "",
"text" : "getcolor $1"
}
}
, {
"box" : {
"id" : "obj-36",
"maxclass" : "number",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 462.0, 15.0, 50.0, 22.0 ],
"style" : ""
}
}
, {
"box" : {
"format" : 6,
"id" : "obj-33",
"maxclass" : "flonum",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 367.5, 15.0, 50.0, 22.0 ],
"style" : ""
}
}
, {
"box" : {
"id" : "obj-34",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 367.5, 46.0, 73.0, 22.0 ],
"style" : "",
"text" : "rotations $1"
}
}
, {
"box" : {
"format" : 6,
"id" : "obj-32",
"maxclass" : "flonum",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "bang" ],
"parameter_enable" : 0,
"patching_rect" : [ 275.5, 15.0, 50.0, 22.0 ],
"style" : ""
}
}
, {
"box" : {
"id" : "obj-28",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 275.5, 46.0, 77.0, 22.0 ],
"style" : "",
"text" : "startcolor $1"
}
}
, {
"box" : {
"id" : "obj-26",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 208.0, 42.0, 51.0, 22.0 ],
"style" : "",
"text" : "random"
}
}
, {
"box" : {
"id" : "obj-24",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 20.0, 10.0, 173.0, 22.0 ],
"style" : "",
"text" : "makeCubehelix 0. 1. 1. 1. 32 1"
}
}
, {
"box" : {
"id" : "obj-22",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 237.0, 612.0, 33.0, 20.0 ],
"style" : "",
"text" : "Hue"
}
}
, {
"box" : {
"id" : "obj-21",
"maxclass" : "comment",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 237.0, 638.0, 69.0, 20.0 ],
"style" : "",
"text" : "Luminance"
}
}
, {
"box" : {
"id" : "obj-19",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 132.0, 612.0, 103.0, 22.0 ],
"style" : "",
"text" : "planemap 1 1 1 1"
}
}
, {
"box" : {
"id" : "obj-18",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 132.0, 638.0, 103.0, 22.0 ],
"style" : "",
"text" : "planemap 3 3 3 3"
}
}
, {
"box" : {
"id" : "obj-16",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 132.0, 583.0, 103.0, 22.0 ],
"style" : "",
"text" : "planemap 0 1 2 3"
}
}
, {
"box" : {
"id" : "obj-13",
"maxclass" : "newobj",
"numinlets" : 1,
"numoutlets" : 0,
"patching_rect" : [ 208.0, 536.0, 52.0, 22.0 ],
"style" : "",
"text" : "print list"
}
}
, {
"box" : {
"id" : "obj-10",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 225.333313, 795.0, 189.0, 22.0 ],
"style" : "",
"text" : "15 0.46834 0.947702 0.333514"
}
}
, {
"box" : {
"id" : "obj-8",
"maxclass" : "message",
"numinlets" : 2,
"numoutlets" : 1,
"outlettype" : [ "" ],
"patching_rect" : [ 169.666656, 752.0, 198.0, 22.0 ],
"style" : "",
"text" : "4 0.053409 0.02406 0.011621"
}
}
, {
"box" : {
"id" : "obj-6",
"maxclass" : "button",
"numinlets" : 1,
"numoutlets" : 1,
"outlettype" : [ "bang" ],
"patching_rect" : [ 302.0, 708.0, 24.0, 24.0 ],
"style" : ""
}
}
, {
"box" : {
"id" : "obj-4",
"maxclass" : "newobj",
"numinlets" : 4,
"numoutlets" : 4,
"outlettype" : [ "", "", "", "" ],
"patching_rect" : [ 302.0, 672.0, 159.0, 22.0 ],
"style" : "",
"text" : "route bang rgbcolor hslcolor"
}
}
, {
"box" : {
"id" : "obj-3",
"maxclass" : "jit.pwindow",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "" ],
"patching_rect" : [ 114.0, 665.0, 80.0, 60.0 ],
"planemap" : [ 3, 3, 3, 3 ]
}
}
, {
"box" : {
"id" : "obj-2",
"maxclass" : "jit.pwindow",
"numinlets" : 1,
"numoutlets" : 2,
"outlettype" : [ "", "" ],
"patching_rect" : [ 20.0, 665.0, 80.0, 60.0 ]
}
}
, {
"box" : {
"bgmode" : 0,
"border" : 0,
"clickthrough" : 0,
"enablehscroll" : 0,
"enablevscroll" : 0,
"id" : "obj-1",
"lockeddragscroll" : 0,
"maxclass" : "bpatcher",
"name" : "Cubehelix.maxpat",
"numinlets" : 1,
"numoutlets" : 4,
"offset" : [ 0.0, 0.0 ],
"outlettype" : [ "jit_matrix", "jit_matrix", "", "" ],
"patching_rect" : [ 20.0, 120.0, 301.0, 398.0 ],
"viewvisibility" : 1
}
}
],
"lines" : [ {
"patchline" : {
"destination" : [ "obj-13", 0 ],
"source" : [ "obj-1", 2 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-2", 0 ],
"source" : [ "obj-1", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-3", 0 ],
"source" : [ "obj-1", 1 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-4", 0 ],
"source" : [ "obj-1", 3 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-3", 0 ],
"source" : [ "obj-16", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-3", 0 ],
"source" : [ "obj-18", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-3", 0 ],
"source" : [ "obj-19", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-1", 0 ],
"source" : [ "obj-24", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-1", 0 ],
"source" : [ "obj-26", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-1", 0 ],
"source" : [ "obj-28", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-28", 0 ],
"source" : [ "obj-32", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-34", 0 ],
"source" : [ "obj-33", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-1", 0 ],
"source" : [ "obj-34", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-38", 0 ],
"source" : [ "obj-36", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-1", 0 ],
"source" : [ "obj-38", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-10", 1 ],
"source" : [ "obj-4", 2 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-6", 0 ],
"source" : [ "obj-4", 0 ]
}
}
, {
"patchline" : {
"destination" : [ "obj-8", 1 ],
"source" : [ "obj-4", 1 ]
}
}
],
"parameters" : {
"obj-1::obj-85" : [ "live.text[1]", "live.text[1]", 0 ],
"obj-1::obj-133" : [ "live.tab[1]", "live.tab", 0 ],
"obj-1::obj-1" : [ "live.text[2]", "live.text[1]", 0 ],
"obj-1::obj-104" : [ "live.tab", "live.tab", 0 ],
"obj-1::obj-141" : [ "live.tab[2]", "live.tab", 0 ]
}
,
"dependency_cache" : [ {
"name" : "Cubehelix.maxpat",
"bootpath" : "~/Documents/_MAX/_RESSOURCE/Color palettes",
"patcherrelativepath" : ".",
"type" : "JSON",
"implicit" : 1
}
, {
"name" : "Cubehelix.js",
"bootpath" : "~/Documents/_MAX/_RESSOURCE/Color palettes",
"patcherrelativepath" : ".",
"type" : "TEXT",
"implicit" : 1
}
],
"autosave" : 0
}
}
Loading…
Cancel
Save