Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Create Balls-n-Noise_DualCore #845

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
245 changes: 245 additions & 0 deletions micropython/examples/pico_explorer/Balls-n-Noise_DualCore
Original file line number Diff line number Diff line change
@@ -0,0 +1,245 @@
This example combines balls_demo.py and noise.py by using both cores and reading a potentiometer input to change the speed of the display and song
# We're creating 100 balls with their own individual colour and 1 BG colour
# for a total of 101 colours, which will all fit in the custom 256 entry palette!

# This example shows you how you can use Pico Explorer's onboard buzzer as a speaker to play different notes and string them together into a bleepy tune.
# It uses code written by Avram Piltch - check out his Tom's Hardware article! https://www.tomshardware.com/uk/how-to/buzzer-music-raspberry-pi-pico
# You'll need to connect a jumper wire between GPO and AUDIO on the Explorer Base to hear noise.

# Create a buzzer on pin 0
# Don't forget to wire GP0 to AUDIO!

# Analogue Dial on a Pimoroni Pico Explorer with Pico Graphics
# 10 K Ohm potentiometer center wiper connection on ADC(0) = GP26
# Don't forget to wire 3V3 and GND to the potentiometer limit connections

import time
import random
from picographics import PicoGraphics, DISPLAY_PICO_EXPLORER, PEN_P8
from pimoroni import Buzzer
import machine
import _thread
from time import sleep

display = PicoGraphics(display=DISPLAY_PICO_EXPLORER, pen_type=PEN_P8)
display.set_backlight(1.0)

WIDTH, HEIGHT = display.get_bounds()

potentiometer = machine.ADC(26) # Install potentiometer

class Ball:
def __init__(self, x, y, r, dx, dy, pen):
self.x = x
self.y = y
self.r = r
self.dx = dx
self.dy = dy
self.pen = pen


# initialise shapes
balls = []
for i in range(0, 100):
r = random.randint(0, 10) + 3
balls.append(
Ball(
random.randint(r, r + (WIDTH - 2 * r)),
random.randint(r, r + (HEIGHT - 2 * r)),
r,
(14 - r) / 2,
(14 - r) / 2,
display.create_pen(random.randint(0, 255), random.randint(0, 255), random.randint(0, 255)),
)
)

BG = display.create_pen(40, 40, 40)

BUZZER = Buzzer(0)

BLACK = display.create_pen(0, 0, 0)
GREEN = display.create_pen(0, 255, 0)

# this handy list converts notes into frequencies, which you can use with the explorer.set_tone function
tones = {
"B0": 31,
"C1": 33,
"CS1": 35,
"D1": 37,
"DS1": 39,
"E1": 41,
"F1": 44,
"FS1": 46,
"G1": 49,
"GS1": 52,
"A1": 55,
"AS1": 58,
"B1": 62,
"C2": 65,
"CS2": 69,
"D2": 73,
"DS2": 78,
"E2": 82,
"F2": 87,
"FS2": 93,
"G2": 98,
"GS2": 104,
"A2": 110,
"AS2": 117,
"B2": 123,
"C3": 131,
"CS3": 139,
"D3": 147,
"DS3": 156,
"E3": 165,
"F3": 175,
"FS3": 185,
"G3": 196,
"GS3": 208,
"A3": 220,
"AS3": 233,
"B3": 247,
"C4": 262,
"CS4": 277,
"D4": 294,
"DS4": 311,
"E4": 330,
"F4": 349,
"FS4": 370,
"G4": 392,
"GS4": 415,
"A4": 440,
"AS4": 466,
"B4": 494,
"C5": 523,
"CS5": 554,
"D5": 587,
"DS5": 622,
"E5": 659,
"F5": 698,
"FS5": 740,
"G5": 784,
"GS5": 831,
"A5": 880,
"AS5": 932,
"B5": 988,
"C6": 1047,
"CS6": 1109,
"D6": 1175,
"DS6": 1245,
"E6": 1319,
"F6": 1397,
"FS6": 1480,
"G6": 1568,
"GS6": 1661,
"A6": 1760,
"AS6": 1865,
"B6": 1976,
"C7": 2093,
"CS7": 2217,
"D7": 2349,
"DS7": 2489,
"E7": 2637,
"F7": 2794,
"FS7": 2960,
"G7": 3136,
"GS7": 3322,
"A7": 3520,
"AS7": 3729,
"B7": 3951,
"C8": 4186,
"CS8": 4435,
"D8": 4699,
"DS8": 4978
}

# put the notes for your song in here!
song = ["AS6", "A6", "AS6", "P", "AS5", "P", "AS5", "P", "F6", "DS6", "D6", "F6", "AS6", "A6", "AS6", "D7", "C7", "AS6", "C7", "P", "C6", "P", "C6", "P", "C6", "AS5", "A5", "C6", "F6", "P", "F6", "P", "G6", "A6", "AS6", "A6", "G6", "F6", "G6", "F6", "DS6", "D6", "DS6", "D6", "C6", "AS5", "AS5", "A5", "G5", "F5", "G5", "AS5", "A5", "C6", "AS5", "D6", "C6", "DS6", "D6", "P", "AS5", "P", "AS5"]

def clear(): # this function clears Pico Explorer's screen to black
display.set_pen(BLACK)
display.clear()
display.update()


def playtone(frequency): # this function tells your program how to make noise
BUZZER.set_tone(frequency)


def bequiet(): # this function tells your program how not to make noise
BUZZER.set_tone(-1)


def playsong(song): # this function plays your song
a = 0 # this variable keeps track of the visualiser bars
for i in range(len(song)):
pot = potentiometer.read_u16()/256
pot = int(pot * 256.0 /255.0) - 1
pot = int(pot *100 / 255)
if pot > 100:
pot = 100
if pot < 1:
pot = 1

pausetime = 0.1 + pot * 0.002

if (song[i] == "P"):
bequiet()
else:
playtone(tones[song[i]])
a += 7
if a >= 240: # clears the screen if the green bars reach the right hand edge
clear()
a = 0
time.sleep(pausetime) # change this number if you want to alter how long the notes play for
bequiet()

sLock = _thread.allocate_lock()

def Core0Task():
while True:
display.set_pen(BG)
display.clear()

pot = potentiometer.read_u16()/256
pot = int(pot * 256.0 /255.0) - 1
pot = int(pot *100 / 255)
if pot > 100:
pot = 100
if pot < 1:
pot = 1

pausetime = 0.001 * pot

for ball in balls:
ball.x += ball.dx
ball.y += ball.dy

xmax = WIDTH - ball.r
xmin = ball.r
ymax = HEIGHT - ball.r
ymin = ball.r

if ball.x < xmin or ball.x > xmax:
ball.dx *= -1

if ball.y < ymin or ball.y > ymax:
ball.dy *= -1

display.set_pen(ball.pen)
display.circle(int(ball.x), int(ball.y), int(ball.r))

display.set_pen(250)
display.set_font("bitmap8")
display.text(str(int(100-pot+1))+"%",5,5,scale=5)

display.update()
time.sleep(pausetime)

def Core1Task():
while True:
playsong(song)

_thread.start_new_thread(Core1Task, ())

Core0Task()