Package net.paulhertz.pixelaudio.example

# Class MultiGenLookupTables

java.lang.Object
processing.core.PApplet
net.paulhertz.pixelaudio.example.MultiGenLookupTables

All Implemented Interfaces:
  `processing.core.PConstants`

public class MultiGenLookupTables extends processing.core.PApplet
The LookupTables example shows how a central element of PixelAudio, the lookup table, connects a 1D audio signal with a 2D bitmap, putting audio samples and RGB pixels in one-to-one correspondence within a single PixelMapGen instance such as a Hilbert, Moore, or DiagonalZigzag.

MultiGenLookupTables does the same thing for MultiGens, which connect multiple PixelMapGens. Imagine the audio signal as line that visits every pixel in a bitmap: the signal's lookup table is simply the list of pixels it visits in the order it visits them. The pixel locations are indices for a pixel array, which starts at (0,0) in the upper left corner of a bitmap, and proceeds left to right, top to bottom. The bitmap has a corresponding lookup table, where the array indices of the audio signal are stored. The lookup tables may be generated by mathematical functions, such as the Hilbert curve, but they only need to be calculated once. PixelAudio classes that implement the abstract PixelMapGen abstract class generate the lookup tables. The "gen" objects plug in to PixelAudioMapper, a class that handles mapping of audio signals and RGB data using lookup tables.

This example also shows basic affine transforms of PixelMapGen objects, such as rotation and reflection, how to change the PixelMapGen a PixelAudioMapper instance is using, and basic animation using array rotation.

Signal path index numbers are small white numbers, bitmap index numbers are big black numbers. Read the imageToSignalLUT values by following the pixel index order and reading the white numbers. Read the signalToImageLUT values by following the signal path order and reading the black numbers. Read the imageToSignalLUT values by following the black pixel numbers in order and reading the white numbers.

This example can be a good place to test your own MultiGen creation methods.

     KEY COMMANDS

     Press 'a' or 'A' to rotate the array of colors one step left or right.
     Press 'g' to display a different generator.
     Press 'n' to hide or show numbers.
     Press 'l' to hide or show lines.
     Press 'd' to print a description of the current generator to the console.
     Press 'k' to print the imageToSignalLUT and the signalToImageLUT to the console.
     Press 't' to print affine maps to the console.
     Press 'r' to rotate 180 degress.
     Press 'x' to flip x-coordinates (reflect on y-axis).
     Press 'y' to flip y-coordinates (reflect on x-axis).
     Press 'h' to show this help text in the console.

TODO There are some annoying bugs associated with some of the transforms and window resizing. For the moment, I've commented out the key commands for the r90, r270, fx90, and fx270 transforms that cause the problem.

- ## Field Summary

  Fields
  Modifier and Type
  Field
  Description
  `(package private) int`
  `bigTextSize`
  `(package private) ArrayList<int[]>`
  `coords`
  `(package private) int`
  `coordsSize`
  `(package private) AffineTransformType`
  `currentTransform`
  `(package private) int`
  `drawingScale`
  `static AffineTransformType`
  `flipx`
  `static AffineTransformType`
  `flipy`
  `static AffineTransformType`
  `fx270`
  `static AffineTransformType`
  `fx90`
  `(package private) PixelMapGen`
  `gen`
  `(package private) int`
  `genH`
  `(package private) int`
  `genW`
  `(package private) PixelMapGen`
  `hilb6x4Loop`
  `(package private) int`
  `imageHeight`
  `(package private) int[]`
  `imageLUT`
  `(package private) int`
  `imageWidth`
  `(package private) boolean`
  `isFitToScreen`
  `(package private) boolean`
  `isHideLines`
  `(package private) boolean`
  `isHideNumbers`
  `(package private) boolean`
  `isOversize`
  `(package private) boolean`
  `isSecondScreen`
  `(package private) PixelAudioMapper`
  `mapper`
  `(package private) int`
  `maxWindowHeight`
  `(package private) int`
  `maxWindowWidth`
  `(package private) PixelMapGen`
  `mixGen`
  `static AffineTransformType`
  `nada`
  `(package private) processing.core.PGraphics`
  `offscreen`
  `(package private) int`
  `offset`
  `(package private) PixelAudio`
  `pixelaudio`
  `static AffineTransformType`
  `r180`
  `static AffineTransformType`
  `r270`
  `static AffineTransformType`
  `r90`
  `(package private) PixelMapGen`
  `randoBou`
  `(package private) int`
  `scaledWindowHeight`
  `(package private) int`
  `scaledWindowWidth`
  `(package private) int`
  `screen2x`
  `(package private) int`
  `screen2y`
  `(package private) int[]`
  `signalLUT`
  `(package private) int`
  `smallTextSize`
  `(package private) int[]`
  `spectrum`
  `(package private) float`
  `windowScale`
  `(package private) PixelMapGen`
  `zz6x4Loop`

  ### Fields inherited from class processing.core.PApplet

  `args, ARGS_BGCOLOR, ARGS_DISABLE_AWT, ARGS_DISPLAY, ARGS_EDITOR_LOCATION, ARGS_EXTERNAL, ARGS_FULL_SCREEN, ARGS_HIDE_STOP, ARGS_LOCATION, ARGS_PRESENT, ARGS_SKETCH_FOLDER, ARGS_STOP_COLOR, ARGS_UI_SCALE, ARGS_WINDOW_COLOR, DEFAULT_HEIGHT, DEFAULT_WIDTH, disableAWT, displayHeight, displayWidth, dmouseX, dmouseY, emouseX, emouseY, exitCalled, EXTERNAL_MOVE, EXTERNAL_STOP, finished, firstMouse, focused, frameCount, frameRate, frameRateLastNanos, g, height, insideDraw, javaPlatform, javaVersion, javaVersionName, key, keyCode, keyEvent, keyPressed, keyRepeatEnabled, looping, matchPatterns, mouseButton, mouseEvent, mousePressed, mouseX, mouseY, pixelDensity, pixelHeight, pixels, pixelWidth, platform, pmouseX, pmouseY, ratioLeft, ratioScale, ratioTop, recorder, redraw, rheight, rmouseX, rmouseY, rwidth, surface, useNativeSelect, width, windowX, windowY`

  ### Fields inherited from interface processing.core.PConstants

  `ADD, ALPHA, ALT, AMBIENT, ARC, ARGB, ARROW, BACKSPACE, BASELINE, BEVEL, BEZIER_VERTEX, BLEND, BLUR, BOTTOM, BOX, BREAK, BURN, CENTER, CHATTER, CHORD, CLAMP, CLOSE, CODED, COMPLAINT, CONTROL, CORNER, CORNERS, CROSS, CURVE_VERTEX, CUSTOM, DARKEST, DEG_TO_RAD, DELETE, DIAMETER, DIFFERENCE, DILATE, DIRECTIONAL, DISABLE_ASYNC_SAVEFRAME, DISABLE_BUFFER_READING, DISABLE_DEPTH_MASK, DISABLE_DEPTH_SORT, DISABLE_DEPTH_TEST, DISABLE_KEY_REPEAT, DISABLE_NATIVE_FONTS, DISABLE_OPENGL_ERRORS, DISABLE_OPTIMIZED_STROKE, DISABLE_STROKE_PERSPECTIVE, DISABLE_STROKE_PURE, DISABLE_TEXTURE_MIPMAPS, DODGE, DOWN, DXF, ELLIPSE, ENABLE_ASYNC_SAVEFRAME, ENABLE_BUFFER_READING, ENABLE_DEPTH_MASK, ENABLE_DEPTH_SORT, ENABLE_DEPTH_TEST, ENABLE_KEY_REPEAT, ENABLE_NATIVE_FONTS, ENABLE_OPENGL_ERRORS, ENABLE_OPTIMIZED_STROKE, ENABLE_STROKE_PERSPECTIVE, ENABLE_STROKE_PURE, ENABLE_TEXTURE_MIPMAPS, ENTER, EPSILON, ERODE, ESC, EXCLUSION, FX2D, GIF, GRAY, GROUP, HALF_PI, HAND, HARD_LIGHT, HINT_COUNT, HSB, IMAGE, INVERT, JAVA2D, JPEG, LANDSCAPE, LEFT, LIGHTEST, LINE, LINE_LOOP, LINE_STRIP, LINES, LINUX, MACOS, MACOSX, MAX_FLOAT, MAX_INT, MIN_FLOAT, MIN_INT, MITER, MODEL, MODELVIEW, MOVE, MULTIPLY, NORMAL, OPAQUE, OPEN, OPENGL, ORTHOGRAPHIC, OTHER, OVERLAY, P2D, P3D, PATH, PDF, PERSPECTIVE, PI, PIE, platformNames, POINT, POINTS, POLYGON, PORTRAIT, POSTERIZE, PROBLEM, PROJECT, PROJECTION, QUAD, QUAD_BEZIER_VERTEX, QUAD_STRIP, QUADRATIC_VERTEX, QUADS, QUARTER_PI, RAD_TO_DEG, RADIUS, RECT, REPEAT, REPLACE, RETURN, RGB, RIGHT, ROUND, SCREEN, SHAPE, SHIFT, SOFT_LIGHT, SPAN, SPHERE, SPOT, SQUARE, SUBTRACT, SVG, TAB, TARGA, TAU, TEXT, THIRD_PI, THRESHOLD, TIFF, TOP, TRIANGLE, TRIANGLE_FAN, TRIANGLE_STRIP, TRIANGLES, TWO_PI, UP, VERTEX, WAIT, WHITESPACE, WINDOWS, X, Y, Z`

- ## Constructor Summary

  Constructors
  Constructor
  Description
  `MultiGenLookupTables()`

- ## Method Summary

  Modifier and Type
  Method
  Description
  `void`
  `draw()`
  `void`
  `drawLines()`
  Draw the signal path lines.
  `void`
  `drawNumbers()`
  Draw the numbers for image path and signal path.
  `void`
  `drawSquares()`
  Draw background squares.
  `MultiGen`
  `hilbertZigzagLoop6x4(int genW, int genH)`
  This method creates a MultiGen consisting of a mix of zigzag and Hilbert curves in 6 columns and 4 rows arranged to provide a continuous loop.
  `int[]`
  `initColors()`
  `void`
  `initGens()`
  `void`
  `initMapper(PixelMapGen gen)`
  `void`
  `keyPressed()`
  `(package private) void`
  `listDisplays()`
  Get a list of available displays and output information about them to the console.
  `void`
  `loadNewGen(PixelMapGen newGen)`
  Load a new PixelMapGen
  `static void`
  `main(String[] args)`
  `void`
  `printLUTs()`
  `void`
  `resizeWindow()`
  `void`
  `setDrawingVars()`
  `void`
  `setScaling(boolean isVerbose)`
  Calculates window sizes for displaying mapImage at actual size and at full screen.
  `void`
  `settings()`
  `void`
  `setup()`
  `void`
  `showHelp()`
  `void`
  `stepAnimation(int step)`
  `void`
  `testAffineMap(int w, int h)`
  `void`
  `updateMapper(PixelMapGen gen)`
  `void`
  `updateWindow()`

  ### Methods inherited from class processing.core.PApplet

  `abs, abs, acos, alpha, ambient, ambient, ambient, ambientLight, ambientLight, append, append, append, append, append, append, applyMatrix, applyMatrix, applyMatrix, applyMatrix, applyMatrix, arc, arc, arraycopy, arraycopy, arraycopy, arrayCopy, arrayCopy, arrayCopy, asin, atan, atan2, attrib, attrib, attrib, attribColor, attribNormal, attribPosition, background, background, background, background, background, background, background, beginCamera, beginContour, beginPGL, beginRaw, beginRaw, beginRecord, beginRecord, beginShape, beginShape, bezier, bezier, bezierDetail, bezierPoint, bezierTangent, bezierVertex, bezierVertex, binary, binary, binary, binary, blend, blend, blendColor, blendMode, blue, box, box, brightness, calcSketchPath, camera, camera, ceil, checkAlpha, checkExtension, choice, choice, circle, clear, clip, color, color, color, color, color, color, color, color, colorMode, colorMode, colorMode, colorMode, concat, concat, concat, concat, concat, concat, concat, constrain, constrain, copy, copy, copy, cos, createFont, createFont, createFont, createGraphics, createGraphics, createGraphics, createImage, createInput, createInput, createInputRaw, createOutput, createOutput, createPath, createPath, createPrimaryGraphics, createReader, createReader, createReader, createShape, createShape, createShape, createWriter, createWriter, createWriter, cursor, cursor, cursor, cursor, curve, curve, curveDetail, curvePoint, curveTangent, curveTightness, curveVertex, curveVertex, dataFile, dataPath, day, debug, degrees, delay, dequeueEvents, desktopFile, desktopPath, die, die, directionalLight, displayDensity, displayDensity, dispose, dist, dist, edge, ellipse, ellipseMode, emissive, emissive, emissive, endCamera, endContour, endPGL, endRaw, endRecord, endShape, endShape, exec, exec, exit, exitActual, exitCalled, exp, expand, expand, expand, expand, expand, expand, expand, expand, expand, expand, expand, expand, expand, expand, expand, expand, expand, expand, fill, fill, fill, fill, fill, fill, filter, filter, filter, floor, flush, focusGained, focusLost, frameMoved, frameRate, frustum, fullScreen, fullScreen, fullScreen, fullScreen, get, get, get, getExtension, getGraphics, getMatrix, getMatrix, getMatrix, getSurface, green, handleDraw, handleKeyEvent, handleMethods, handleMouseEvent, hex, hex, hex, hex, hideMenuBar, hint, hour, hue, image, image, image, imageMode, initSurface, insertFrame, isLooping, join, join, keyPressed, keyReleased, keyReleased, keyTyped, keyTyped, launch, lerp, lerpColor, lerpColor, lightFalloff, lights, lightSpecular, line, line, link, listFiles, listFiles, listPaths, loadBytes, loadBytes, loadBytes, loadFont, loadImage, loadImage, loadJSONArray, loadJSONArray, loadJSONObject, loadJSONObject, loadPixels, loadShader, loadShader, loadShape, loadShape, loadStrings, loadStrings, loadStrings, loadStrings, loadTable, loadTable, loadXML, loadXML, log, loop, mag, mag, main, main, main, makeGraphics, map, mask, match, matchAll, max, max, max, max, max, max, method, millis, min, min, min, min, min, min, minute, modelX, modelY, modelZ, month, mouseClicked, mouseClicked, mouseDragged, mouseDragged, mouseEntered, mouseEntered, mouseExited, mouseExited, mouseMoved, mouseMoved, mousePressed, mousePressed, mouseReleased, mouseReleased, mouseWheel, mouseWheel, nf, nf, nf, nf, nf, nf, nfc, nfc, nfc, nfc, nfp, nfp, nfp, nfp, nfs, nfs, nfs, nfs, noClip, noCursor, noFill, noise, noise, noise, noiseDetail, noiseDetail, noiseSeed, noLights, noLoop, norm, normal, noSmooth, noStroke, noTexture, noTint, orientation, ortho, ortho, ortho, parseBoolean, parseBoolean, parseBoolean, parseBoolean, parseByte, parseByte, parseByte, parseByte, parseByte, parseByte, parseByte, parseByte, parseChar, parseChar, parseChar, parseChar, parseFloat, parseFloat, parseFloat, parseFloat, parseFloat, parseFloat, parseFloat, parseInt, parseInt, parseInt, parseInt, parseInt, parseInt, parseInt, parseInt, parseInt, parseInt, parseInt, parseInt, parseJSONArray, parseJSONObject, parseXML, parseXML, pause, perspective, perspective, pixelDensity, point, point, pointLight, pop, popMatrix, popStyle, postEvent, postWindowMoved, postWindowResized, pow, print, print, print, print, print, print, print, print, print, printArray, printCamera, println, println, println, println, println, println, println, println, println, println, println, printMatrix, printProjection, printStackTrace, push, pushMatrix, pushStyle, quad, quadraticVertex, quadraticVertex, radians, random, random, randomGaussian, randomSeed, rect, rect, rect, rectMode, red, redraw, registerMethod, requestImage, requestImage, resetMatrix, resetShader, resetShader, resume, reverse, reverse, reverse, reverse, reverse, reverse, reverse, rotate, rotate, rotateX, rotateY, rotateZ, round, runSketch, runSketch, runSketch, saturation, save, saveBytes, saveBytes, saveBytes, saveFile, saveFrame, saveFrame, saveJSONArray, saveJSONArray, saveJSONObject, saveJSONObject, savePath, saveStream, saveStream, saveStream, saveStream, saveStream, saveStrings, saveStrings, saveStrings, saveTable, saveTable, saveXML, saveXML, scale, scale, scale, screenX, screenX, screenY, screenY, screenZ, second, selectCallback, selectFolder, selectFolder, selectFolder, selectInput, selectInput, selectInput, selectOutput, selectOutput, selectOutput, set, set, setMatrix, setMatrix, setMatrix, setSize, shader, shader, shape, shape, shape, shapeMode, shearX, shearY, shell, shininess, shorten, shorten, shorten, shorten, shorten, shorten, shorten, showDepthWarning, showDepthWarningXYZ, showMethodWarning, showMissingWarning, showSurface, showVariationWarning, sin, size, size, size, sketchDisplay, sketchFile, sketchFullScreen, sketchHeight, sketchOutputPath, sketchOutputStream, sketchPath, sketchPath, sketchPixelDensity, sketchRenderer, sketchSmooth, sketchWidth, sketchWindowColor, smooth, smooth, sort, sort, sort, sort, sort, sort, sort, sort, sort, sort, specular, specular, specular, sphere, sphereDetail, sphereDetail, splice, splice, splice, splice, splice, splice, splice, splice, splice, splice, splice, splice, splice, split, split, splitTokens, splitTokens, spotLight, sq, sqrt, square, start, startSurface, stop, str, str, str, str, str, str, str, str, str, str, stroke, stroke, stroke, stroke, stroke, stroke, strokeCap, strokeJoin, strokeWeight, style, subset, subset, subset, subset, subset, subset, subset, subset, subset, subset, subset, subset, subset, subset, subset, subset, subset, subset, tan, text, text, text, text, text, text, text, text, text, text, text, textAlign, textAlign, textAscent, textDescent, textFont, textFont, textLeading, textMode, textSize, texture, textureMode, textureWrap, textWidth, textWidth, textWidth, thread, tint, tint, tint, tint, tint, tint, translate, translate, triangle, trim, trim, unbinary, unhex, unregisterMethod, updatePixels, updatePixels, urlDecode, urlEncode, vertex, vertex, vertex, vertex, vertex, windowMove, windowMoved, windowRatio, windowResizable, windowResize, windowResized, windowTitle, year`

  ### Methods inherited from class java.lang.Object

  `clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

- ## Field Details

  - ### pixelaudio

    PixelAudio pixelaudio

  - ### hilb6x4Loop

    PixelMapGen hilb6x4Loop

  - ### mixGen

    PixelMapGen mixGen

  - ### zz6x4Loop

    PixelMapGen zz6x4Loop

  - ### randoBou

    PixelMapGen randoBou

  - ### gen

    PixelMapGen gen

  - ### mapper

    PixelAudioMapper mapper

  - ### spectrum

    int[] spectrum

  - ### coords

    ArrayList<int[]> coords

  - ### imageLUT

    int[] imageLUT

  - ### signalLUT

    int[] signalLUT

  - ### imageWidth

    int imageWidth

  - ### imageHeight

    int imageHeight

  - ### genW

    int genW

  - ### genH

    int genH

  - ### drawingScale

    int drawingScale

  - ### offset

    int offset

  - ### bigTextSize

    int bigTextSize

  - ### smallTextSize

    int smallTextSize

  - ### coordsSize

    int coordsSize

  - ### isHideNumbers

    boolean isHideNumbers

  - ### isHideLines

    boolean isHideLines

  - ### offscreen

    processing.core.PGraphics offscreen

  - ### r270

    public static AffineTransformType r270

  - ### r90

    public static AffineTransformType r90

  - ### r180

    public static AffineTransformType r180

  - ### flipx

    public static AffineTransformType flipx

  - ### fx270

    public static AffineTransformType fx270

  - ### fx90

    public static AffineTransformType fx90

  - ### flipy

    public static AffineTransformType flipy

  - ### nada

    public static AffineTransformType nada

  - ### currentTransform

    AffineTransformType currentTransform

  - ### isOversize

    boolean isOversize

  - ### isFitToScreen

    boolean isFitToScreen

  - ### maxWindowWidth

    int maxWindowWidth

  - ### maxWindowHeight

    int maxWindowHeight

  - ### scaledWindowWidth

    int scaledWindowWidth

  - ### scaledWindowHeight

    int scaledWindowHeight

  - ### windowScale

    float windowScale

  - ### isSecondScreen

    boolean isSecondScreen

  - ### screen2x

    int screen2x

  - ### screen2y

    int screen2y

- ## Constructor Details

  - ### MultiGenLookupTables

    public MultiGenLookupTables()

- ## Method Details

  - ### main

    public static void main(String[] args)

  - ### settings

    public void settings()
    Overrides:
      `settings` in class `processing.core.PApplet`

  - ### setup

    public void setup()
    Overrides:
      `setup` in class `processing.core.PApplet`

  - ### setDrawingVars

    public void setDrawingVars()

  - ### hilbertZigzagLoop6x4

    public MultiGen hilbertZigzagLoop6x4(int genW, int genH)
    This method creates a MultiGen consisting of a mix of zigzag and Hilbert curves in 6 columns and 4 rows arranged to provide a continuous loop. This method shows one approach to mixing different PixelMapGens in a MultiGen. We use "gen" as an abbreviated name for a PixelMapGen.
    Parameters:
      `genW` -
      `genH` -
    Returns:

  - ### initGens

    public void initGens()

  - ### initMapper

    public void initMapper(PixelMapGen gen)

  - ### updateMapper

    public void updateMapper(PixelMapGen gen)

  - ### updateWindow

    public void updateWindow()

  - ### draw

    public void draw()
    Overrides:
      `draw` in class `processing.core.PApplet`

  - ### keyPressed

    public void keyPressed()
    Overrides:
      `keyPressed` in class `processing.core.PApplet`

  - ### loadNewGen

    public void loadNewGen(PixelMapGen newGen)
    Load a new PixelMapGen

  - ### initColors

    public int[] initColors()

  - ### printLUTs

    public void printLUTs()

  - ### testAffineMap

    public void testAffineMap(int w, int h)

  - ### drawSquares

    public void drawSquares()
    Draw background squares.

  - ### drawLines

    public void drawLines()
    Draw the signal path lines.

  - ### drawNumbers

    public void drawNumbers()
    Draw the numbers for image path and signal path.

  - ### stepAnimation

    public void stepAnimation(int step)

  - ### showHelp

    public void showHelp()

  - ### listDisplays

    void listDisplays()
    Get a list of available displays and output information about them to the console. Sets screen2x, screen2y, displayWidth and displayHeight from dimensions of a second display.

  - ### setScaling

    public void setScaling(boolean isVerbose)
    Calculates window sizes for displaying mapImage at actual size and at full screen. Press the 'r' key to resize the display window. This method will result in display on a second screen, if one is available. If mapImage is smaller than the screen, mapImage is displayed at size on startup and resizing zooms the image. If mapImage is bigger than the display, mapImage is fit to the screen on startup and resizing shows it at full size, partially filling the window.
    Parameters:
      `isVerbose` - if true, post comments to the console

  - ### resizeWindow

    public void resizeWindow()