WCCChallenge: IncompleteRelics

WCCChallenge: IncompleteRelics

For this week's Creative Code challenge by @sableRalph : Finished an Unfinished Piece, I decided to go back to my Rubberband Relics Piece, Where I sonified the " Incomplete Relics" in SonicPi from Code written in Python.

Traditional Poem for these Submissions

Incomplete
Doesn't mean it is over
For it could be as deep
as it can be on top and hover

Finishing the unfinished relics
Can make their eyes stop their blinks
And leave the brain the ability to think

It now has to render
With a quicker time than using Blender
making sure the vibes are tender
as these transactions can be sent back to sender
or the lender

Since the theme is "Unfinished", the Sound of "Incomplete Relics" has a layered component to represent how the translation may be incomplete and attempts to bring fullness to it

  • Normal soundscape

  • Reverse soundscape

  • 50% slow down on soundscape

  • 50% slow down of reverse soundscape

IllestPreacha · IncompleteRelics

Words used in the Python Random Generator

List of Possible Instructional Words

'''
List of instructions in the Rubberband TExt to for generative colorscape building for the relics

Green
Yellow
Red
Black
Purple
Orange
Brown
Neutral
Up
Down
Left
Right
Pin
PinConsistent
PinSwitch
Diagonal
PinnerChoice
Short
Long
Medium
Interior
Exterior
Double
Single
Triple

IF no color in line, then follow instructions and choose your own color scheme
if not alot of instructions, be flexible with pin and band execution
read line and flow as such

'''

In the Python Code, there is a random word generator that is embedded in a timer function. After a word is generated, it is sent to SonicPi to be sonified

#external code borrowed for timer: -https://www.geeksforgeeks.org/how-to-create-a-countdown-timer-using-python/

#Import random function , alongside osc functions
import random as rd

from pythonosc import osc_message_builder
from pythonosc import udp_client

# import the time module
import time

with open("RubberBand.txt", "r") as adj:  #open and read the text file
    IWT = adj.read()  #give the file a variable name 
    IWTUsed = list(map(str,IWT.split())) #individuals words

# define the countdown func.
def countdown(t):

    while t:
        mins, secs = divmod(t, 60)
        timer = '{:02d}:{:02d}'.format(mins, secs)
        print(timer, end="\r")
        time.sleep(1)


#Random Word Generator being sent to SonicPi
        if t % 1 == 0:
            sender = udp_client.SimpleUDPClient('127.0.0.1', 4560)
            sender.send_message('/pattern1', [rd.choice(IWTUsed), 100, 8, 45])
            sender.send_message('/pattern2', [rd.choice(IWTUsed), 100,rd.randint(5,12) , 45])
            sender.send_message('/pattern3', [rd.choice(IWTUsed), 100, 8, rd.randint(40,60)])

        t -= 1


# input time in seconds
t = input("Enter the time in seconds: ")

# function call
countdown(int(t))

In the code below, we categorized the list of words(seen above) into four arrays and then make sure, we account for each array combination to get sound.

Colors = ['Green','Yellow','Red','Black','Purple','Orange','Brown','Neutral']
Direction =  ['Up','Down','Left','Right','Diagonal']
Placement = ['Short','Long','Medium','Interior','Exterior','Double','Single','Triple']
Pins = ['Pin','PinConsistent','PinSwitch','PinnerChoice','Interior','Exterior']

#setting the conditionals rules of what is recieved from the Python Code

live_loop :phase1 do
  use_real_time
  a, b, c, d = sync "/osc*/pattern1"
  with_fx :flanger, mix: rrand(0.1,0.9) do
    if Placement.include? a or Direction.include? a
      sample :drum_cowbell , rate: 0.5, decay: dice(5) if spread(d,b).tick
    end
    if Pins.include? a or Colors.include? a
      sample :drum_bass_soft , decay: dice(5) if spread(d,b).tick
    end
  end
end



live_loop :phase2 do
  use_real_time
  a, b, c, d = sync "/osc*/pattern2"
  if Placement.include? a or Colors.include? a
    sample :elec_blip , sustain: dice(4) if spread(c,d).tick
  end
  if Pins.include? a or Direction.include? a
    sample :elec_bong, sustain: dice(4) if spread(c,d).tick
  end
end


live_loop :phase3 do
  use_real_time
  a, b, c, d = sync "/osc*/pattern3"
  if Colors.include? a or Pins.include? a
    with_fx :echo, mix: 0.6, decay: 4 do
      sample :tabla_ghe2, sustain: dice(4) if spread(c,d).tick
    end
  end
  if Direction.include? a or Placement.include? a
    with_fx :krush, mix: rrand(0.3,0.6) do
      sample :tabla_ghe2 , sustain: dice(4), attack: dice(3) if spread(c,d).tick
    end

  end
end