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
     
    (package private) ArrayList<int[]>
     
    (package private) int
     
    (package private) AffineTransformType
     
    (package private) int
     
     
     
     
     
    (package private) PixelMapGen
     
    (package private) int
     
    (package private) int
     
    (package private) PixelMapGen
     
    (package private) int
     
    (package private) int[]
     
    (package private) int
     
    (package private) boolean
     
    (package private) boolean
     
    (package private) boolean
     
    (package private) boolean
     
    (package private) boolean
     
    (package private) PixelAudioMapper
     
    (package private) int
     
    (package private) int
     
    (package private) PixelMapGen
     
     
    (package private) processing.core.PGraphics
     
    (package private) int
     
    (package private) PixelAudio
     
     
     
     
    (package private) PixelMapGen
     
    (package private) int
     
    (package private) int
     
    (package private) int
     
    (package private) int
     
    (package private) int[]
     
    (package private) int
     
    (package private) int[]
     
    (package private) float
     
    (package private) PixelMapGen
     

    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
     
  • Method Summary

    Modifier and Type
    Method
    Description
    void
     
    void
    Draw the signal path lines.
    void
    Draw the numbers for image path and signal path.
    void
    Draw background squares.
    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[]
     
    void
     
    void
     
    void
     
    (package private) void
    Get a list of available displays and output information about them to the console.
    void
    Load a new PixelMapGen
    static void
    main(String[] args)
     
    void
     
    void
     
    void
     
    void
    setScaling(boolean isVerbose)
    Calculates window sizes for displaying mapImage at actual size and at full screen.
    void
     
    void
     
    void
     
    void
    stepAnimation(int step)
     
    void
    testAffineMap(int w, int h)
     
    void
     
    void
     

    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

    • 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()