Genuary2024_Physics

Genuary2024_Physics

Shapes & Physics

SpinningShapes

For Genuary2024 Day 15: Physics Library, coded geometric physics with PhysicsJs, Hydra and SonicPi, Allowing the shapes to spin and spin!

Poem

Spin left, Spin RIght
Rotating loose and tight
Spinning, even if the lights are dimming
For the physics allow to keep spinning
Across the screen as they pivot
With no Limits

Video

Code

PhysicsJs

//Furthering the code in the Basic Usage Link: h
//https://wellcaffeinated.net/PhysicsJS/basic-usage
Physics(function(world){



  const d = new Date();
let time4 = d.getTime();

  var viewWidth = 1200;
  var viewHeight = 800;

  pick = ['orange','blue','red','black','green','gold']

  var renderer = Physics.renderer('canvas', {
    el: 'viewport',
    width: viewWidth,
    height: viewHeight,
    meta: false, // don't display meta data
    styles: {
        // set colors for the circle bodies
        'circle' : {
            strokeStyle: 'blue',
            lineWidth: time4 % 10 + 1,
            fillStyle: pick[time4 % 6],
            angleIndicator: 'yellow'
        },
          'rectangle' : {
            strokeStyle: pick[time4 % 6],
            lineWidth: time4 % 10 + 1,
            fillStyle: pick[time4 % 6-1],
            angleIndicator: 'yellow'

        },'convex-polygon' : {
            strokeStyle: 'white',
            lineWidth: time4 % 10 + 5,
            fillStyle: pick[time4 % 6-2],
            angleIndicator: 'red'
        }


    }
  });

  // add the renderer
  world.add( renderer );
  // render on each step
  world.on('step', function(){
    world.render();
  });

  // bounds of the window
  var viewportBounds = Physics.aabb(0, 0, viewWidth, viewHeight);

  // constrain objects to these bounds
  world.add(Physics.behavior('edge-collision-detection', {
      aabb: viewportBounds,
      restitution: 0.99,
      cof: 0.99
  }));

  // add a circle
  world.add(
      Physics.body('circle', {
        x: 80, // x-coordinate
        y: 30, // y-coordinate
        vx: 0.5, // velocity in x-direction
        vy: 0.11, // velocity in y-direction
        radius: 20
      })
  );

         world.add(
      Physics.body('rectangle', {
        x: 180, // x-coordinate
        y: 130, // y-coordinate
        vx: 0.15, // velocity in x-direction
        vy: 0.211, // velocity in y-direction
          width: 150,
          height: 150
      })
  );


      // add a circle
  world.add(
      Physics.body('circle', {
        x: 80, // x-coordinate
        y: 30, // y-coordinate
        vx: 0.5, // velocity in x-direction
        vy: 0.11, // velocity in y-direction
        radius: 40
      })
  );


      world.add(
      Physics.body('circle', {
        x: 180, // x-coordinate
        y: 130, // y-coordinate
        vx: 0.15, // velocity in x-direction
        vy: 0.211, // velocity in y-direction
        radius:  17
      })
  );


world.add( Physics.body('convex-polygon', {
    x: 400,
    y: 200,
    vx: -0.02,
    vertices: [
        {x: 10, y: 70},
        {x: 80, y: 0},
        {x: 0, y: -80},
        {x: -30, y: -30},
        {x: -30, y: 30},
    ]
}) );

        world.add( Physics.body('convex-polygon', {
    x: 400,
    y: 200,
    vx: -0.02,
    vertices: [
        {x: 20, y: 50},
        {x: 80, y: 0},
        {x: 0, y: -80},
        {x: -30, y: -30},
        {x: -30, y: 70},
    ]
}) );


  // ensure objects bounce when edge collision is detected
  world.add( Physics.behavior('body-impulse-response') );

  // add some gravity
  world.add( Physics.behavior('constant-acceleration') );

  //add collisions between the shapes
    world.add( Physics.behavior('body-collision-detection') );
world.add( Physics.behavior('sweep-prune') );

  // subscribe to ticker to advance the simulation
  Physics.util.ticker.on(function( time, dt ){

      world.step( time );



  });

  // start the ticker
  Physics.util.ticker.start();

});

SonicPi

# Loading previous buffer contents. Please wait...def soundtrack()
live_loop :addition do

  use_random_seed Time.now.to_i


  # recursion call being the function calling a new sub string
  def Addition(arr)
    return 1 if arr.length == 0
    arr[0] + Addition(arr[1..-1])
  end

  #variables that will be used in the Method Call below
  #Dice is a randomizer that functions as a dice roll
  a = dice(6)
  b = dice(6)
  c = dice(6)
  d = rrand_i(2,5)
  e = 3

  #Calling the Method to aid with sound design
  smacks = Addition([a,b,c,d,e])
  notes = Addition([a,b,d])

  #sound elements
  if notes % 2 == 0

    with_fx :flanger, mix: rrand(0.3,0.5) do
      with_fx :echo do
        use_random_seed Time.now.to_i / 2
        use_synth [:pretty_bell, :kalimba, :prophet].choose
        play notes * 4, attack: dice(6)
      end
    end
  else

    with_fx :whammy, mix: rrand(0.2,0.6) do
      with_fx :gverb do
        use_synth [:chipbass, :kalimba, :prophet].choose
        play notes * 4, attack: dice(6)
      end
    end
  end

  if smacks > 10

    use_random_seed Time.now.to_i/4

    if notes > 8

      use_random_seed Time.now.to_i/5


      with_fx :vowel ,voice: dice(4) do
        sample :drum_bass_hard, decay: smacks / 12 if spread(smacks/4, smacks/3).look
      end

    else
      with_fx :ixi_techno, mix: 0.75 do
        sample :drum_bass_soft, decay: smacks / 12 if spread(smacks/4, smacks/3).look
      end
    end

  else

    if notes > 8

      with_fx :vowel do
        sample :tabla_ghe1, decay: smacks / 12 if spread(smacks/4, smacks/3).look
      end

    else
      with_fx :ixi_techno, mix: 0.75 do
        sample :tabla_ghe3, decay: smacks / 12 if spread(smacks/4, smacks/3).look
      end
    end

  end


  #print out numbers
  puts Addition([a,b,c,d,e])
  puts notes

  sleep [0.25,0.5,1,2].choose
end

Hydra


s0.initScreen()

src(s0).scale([0.5,1,2]).pixelate(500,500).out()