just getting started
This commit is contained in:
parent
b34623efcd
commit
d1b199581f
7 changed files with 289 additions and 0 deletions
76
acid2.rb
Executable file
76
acid2.rb
Executable file
|
@ -0,0 +1,76 @@
|
||||||
|
# Welcome to Sonic Pi v2.6
|
||||||
|
# Acid
|
||||||
|
# Coded by Sam Aaron
|
||||||
|
# Hacked around by RJS & JHR
|
||||||
|
|
||||||
|
require '/home/pi/gps/gps.rb'
|
||||||
|
|
||||||
|
gps = Gps::Receiver.create('gpsd',:host => 'localhost', :port => 2947)
|
||||||
|
|
||||||
|
gps.start
|
||||||
|
|
||||||
|
sleep 2
|
||||||
|
|
||||||
|
puts gps.latitude
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
use_debug false
|
||||||
|
load_sample :bd_fat
|
||||||
|
|
||||||
|
8.times do
|
||||||
|
sample :bd_fat, amp: (line 0, 5, steps: 8).tick
|
||||||
|
sleep 0.5
|
||||||
|
end
|
||||||
|
|
||||||
|
live_loop :drums do
|
||||||
|
sample :bd_fat, amp: 5
|
||||||
|
sleep 0.5
|
||||||
|
end
|
||||||
|
|
||||||
|
live_loop :acid do
|
||||||
|
cue :foo
|
||||||
|
4.times do |i|
|
||||||
|
long = (gps.longitude.abs * 10**9) % 100
|
||||||
|
use_random_seed long
|
||||||
|
16.times do
|
||||||
|
use_synth :tb303
|
||||||
|
play chord(:e5, :minor).choose, attack: 0, release: 0.1, cutoff: rrand_i(50, 90) + i * 10
|
||||||
|
sleep 0.125
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
cue :bar
|
||||||
|
use_synth :tb303
|
||||||
|
32.times do |i|
|
||||||
|
gspeed = gps.speed.modulo(1)
|
||||||
|
puts gspeed
|
||||||
|
play chord(:b4, :minor).choose, attack: 0, release: 0.05, cutoff: rrand_i(70, 98) + i, res: gspeed
|
||||||
|
sleep 0.125
|
||||||
|
end
|
||||||
|
|
||||||
|
cue :baz
|
||||||
|
with_fx :reverb, mix: 0.3 do |r|
|
||||||
|
32.times do |m|
|
||||||
|
control r, mix: 0.3 + (0.5 * (m.to_f / 32.0)) unless m == 0 if m % 8 == 0
|
||||||
|
use_synth :prophet
|
||||||
|
play chord(:e6, :minor).choose, attack: 0, release: 0.08, cutoff: rrand_i(110, 130)
|
||||||
|
sleep 0.125
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
cue :quux
|
||||||
|
in_thread do
|
||||||
|
use_random_seed 668
|
||||||
|
slat = (gps.latitude.abs * 10**7).modulo(1)
|
||||||
|
with_fx :slicer, mix: 0.75, wave: 3, phase: slat do
|
||||||
|
16.times do
|
||||||
|
use_synth :tb303
|
||||||
|
play chord(:d3, :major).choose, attack: 0, release: 0.1, cutoff: rrand(50, 100)
|
||||||
|
sleep 0.25
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
sleep 4
|
||||||
|
end
|
21
gps/gps.rb
Normal file
21
gps/gps.rb
Normal file
|
@ -0,0 +1,21 @@
|
||||||
|
$:.unshift File.dirname(__FILE__)
|
||||||
|
|
||||||
|
module Gps
|
||||||
|
end
|
||||||
|
|
||||||
|
begin
|
||||||
|
require "rubygems"
|
||||||
|
rescue LoadError
|
||||||
|
end
|
||||||
|
|
||||||
|
if Object.const_defined?("Gem")
|
||||||
|
begin
|
||||||
|
require "gem_plugin"
|
||||||
|
rescue LoadError
|
||||||
|
end
|
||||||
|
end
|
||||||
|
require "gps/fix"
|
||||||
|
require "gps/receiver"
|
||||||
|
require "gps/receivers/gpsd"
|
||||||
|
|
||||||
|
GemPlugin::Manager.instance.load "gps" => GemPlugin::INCLUDE if Object.const_defined?("GemPlugin")
|
13
gps/gps/fix.rb
Normal file
13
gps/gps/fix.rb
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
# Module representing all data in a GPS fix.
|
||||||
|
module Gps::Fix
|
||||||
|
attr_reader :last_tag, :timestamp, :timestamp_error_estimate, :latitude, :longitude, :altitude, :horizontal_error_estimate, :vertical_error_estimate, :course, :speed, :climb, :course_error_estimate, :speed_error_estimate, :climb_error_estimate, :satellites
|
||||||
|
|
||||||
|
def initialize(*args)
|
||||||
|
@altitude = 0
|
||||||
|
@latitude = 0
|
||||||
|
@longitude = 0
|
||||||
|
@speed = 0
|
||||||
|
@course = 0
|
||||||
|
@satellites = 0
|
||||||
|
end
|
||||||
|
end
|
112
gps/gps/receiver.rb
Normal file
112
gps/gps/receiver.rb
Normal file
|
@ -0,0 +1,112 @@
|
||||||
|
# Represents a provider of GPS fixes and a dispatcher of event callbacks for applications needing
|
||||||
|
# such fixes.
|
||||||
|
module Gps
|
||||||
|
class Receiver
|
||||||
|
include Fix
|
||||||
|
|
||||||
|
def initialize(options = {})
|
||||||
|
super
|
||||||
|
@last_latitude = @last_longitude = 0
|
||||||
|
@position_change_threshold = 0
|
||||||
|
@last_speed = 0
|
||||||
|
@last_course = 0
|
||||||
|
@last_altitude = 0
|
||||||
|
@last_satellites = 0
|
||||||
|
end
|
||||||
|
|
||||||
|
# Factory for creating a +Receiver+.
|
||||||
|
# Accepts an implementation and a hash of options, both optional. If no
|
||||||
|
# implementation is provided, the first is used by default. Implementations are in
|
||||||
|
# the module +Gps::Receivers+.
|
||||||
|
def self.create(arg = nil, args = {})
|
||||||
|
implementation = arg.respond_to?(:capitalize)? Receivers.const_get(arg.capitalize): Receivers.const_get(Receivers.constants[0])
|
||||||
|
options = arg.kind_of?(Hash)? arg: args
|
||||||
|
implementation.new(options)
|
||||||
|
end
|
||||||
|
|
||||||
|
# Sets the position from an array of the form [latitude, longitude], calling the
|
||||||
|
# _on_position_change_ callback if necessary.
|
||||||
|
def position=(value)
|
||||||
|
@latitude = value[0]
|
||||||
|
@longitude = value[1]
|
||||||
|
call_position_change_if_necessary
|
||||||
|
end
|
||||||
|
|
||||||
|
# Called on position change, but only if the change is greater than +threshold+ degrees.
|
||||||
|
# The block receives the amount of change in degrees.
|
||||||
|
def on_position_change(threshold = 0, &block)
|
||||||
|
@position_change_threshold = threshold
|
||||||
|
@on_position_change = block
|
||||||
|
end
|
||||||
|
|
||||||
|
# Called on speed change.
|
||||||
|
def on_speed_change(&block)
|
||||||
|
@on_speed_change = block
|
||||||
|
end
|
||||||
|
|
||||||
|
# Called on course change.
|
||||||
|
def on_course_change(&block)
|
||||||
|
@on_course_change = block
|
||||||
|
end
|
||||||
|
|
||||||
|
# Called when the altitude changes.
|
||||||
|
def on_altitude_change(&block)
|
||||||
|
@on_altitude_change = block
|
||||||
|
end
|
||||||
|
|
||||||
|
# Called when the number of visible satellites changes.
|
||||||
|
def on_satellites_change(&block)
|
||||||
|
@on_satellites_change = block
|
||||||
|
end
|
||||||
|
|
||||||
|
# Override this in children. Opens the connection, device, etc.
|
||||||
|
def start
|
||||||
|
@thread = Thread.new do
|
||||||
|
while true
|
||||||
|
update
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
# Override this in children. Closes the device, connection, etc. and stops updating.
|
||||||
|
def stop
|
||||||
|
@thread.kill if @thread
|
||||||
|
@thread = nil
|
||||||
|
end
|
||||||
|
|
||||||
|
# Returns _true_ if started, _false_ otherwise.
|
||||||
|
def started?
|
||||||
|
!@thread.nil? && @thread.alive?
|
||||||
|
end
|
||||||
|
|
||||||
|
# Override this in children, setting fix variables from the GPS receiver.
|
||||||
|
# Here we dispatch to callbacks if necessary.
|
||||||
|
def update
|
||||||
|
call_position_change_if_necessary
|
||||||
|
@on_speed_change.call if @on_speed_change and @speed != @last_speed
|
||||||
|
@last_speed = @speed
|
||||||
|
@on_course_change.call if @on_course_change and @course != @last_course
|
||||||
|
@last_course = @course
|
||||||
|
@on_altitude_change.call if @on_altitude_change and @altitude != @last_altitude
|
||||||
|
@last_altitude = @altitude
|
||||||
|
@on_satellites_change.call if @on_satellites_change and @satellites != @last_satellites
|
||||||
|
@last_satellites = @satellites
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def call_position_change_if_necessary
|
||||||
|
if position_change > @position_change_threshold
|
||||||
|
@on_position_change.call(position_change) if @on_position_change
|
||||||
|
@last_latitude = @latitude
|
||||||
|
@last_longitude = @longitude
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
def position_change
|
||||||
|
(@latitude-@last_latitude).abs+(@longitude-@last_longitude).abs
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
module Receivers
|
||||||
|
end
|
||||||
|
end
|
52
gps/gps/receivers/gpsd.rb
Normal file
52
gps/gps/receivers/gpsd.rb
Normal file
|
@ -0,0 +1,52 @@
|
||||||
|
require "socket"
|
||||||
|
require 'json'
|
||||||
|
|
||||||
|
# Represents a +Receiver+ that obtains information from GPSD.
|
||||||
|
module Gps::Receivers
|
||||||
|
class Gpsd < Gps::Receiver
|
||||||
|
attr_reader :host, :port
|
||||||
|
|
||||||
|
# Accepts an options +Hash+ consisting of the following:
|
||||||
|
# * _:host_: The host to which to connect
|
||||||
|
# * _:port_: The port to which to connect
|
||||||
|
def initialize(options = {})
|
||||||
|
super
|
||||||
|
@host ||= options[:host] ||= "localhost"
|
||||||
|
@port = options[:port] ||= 2947
|
||||||
|
end
|
||||||
|
|
||||||
|
def start
|
||||||
|
@socket = TCPSocket.new(@host, @port)
|
||||||
|
@socket.puts("?WATCH={\"enable\":true,\"json\": true}")
|
||||||
|
super
|
||||||
|
end
|
||||||
|
|
||||||
|
def update
|
||||||
|
line = @socket.gets.chomp
|
||||||
|
return if !line
|
||||||
|
jline = JSON.parse(line)
|
||||||
|
#puts jline.inspect
|
||||||
|
|
||||||
|
msgtype = jline['class']
|
||||||
|
case msgtype
|
||||||
|
when 'TPV'
|
||||||
|
@last_tag = jline['tag']
|
||||||
|
@timestamp = jline['time']
|
||||||
|
@timestamp_error_estimate = jline['ept']
|
||||||
|
@latitude = jline['lat']
|
||||||
|
@longitude = jline['lon']
|
||||||
|
@altitude = jline['lon']
|
||||||
|
@horizontal_error_estimate = jline['epx']
|
||||||
|
@vertical_error_estimate = jline['epv']
|
||||||
|
@course = jline['track']
|
||||||
|
@speed = jline['speed']
|
||||||
|
@climb = jline['climb']
|
||||||
|
@course_error_estimate = jline['epd']
|
||||||
|
@speed_error_estimate = jline['eps']
|
||||||
|
@climb_error_estimate = jline['epc']
|
||||||
|
when 'SKY'
|
||||||
|
@satellites = jline['satellites']
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
||||||
|
end
|
9
gps/gps/version.rb
Normal file
9
gps/gps/version.rb
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
module Gps #:nodoc:
|
||||||
|
module VERSION #:nodoc:
|
||||||
|
MAJOR = 0
|
||||||
|
MINOR = 0
|
||||||
|
TINY = 1
|
||||||
|
|
||||||
|
STRING = [MAJOR, MINOR, TINY].join('.')
|
||||||
|
end
|
||||||
|
end
|
6
startup.sh
Executable file
6
startup.sh
Executable file
|
@ -0,0 +1,6 @@
|
||||||
|
#!/bin/bash -x
|
||||||
|
|
||||||
|
sleep 20
|
||||||
|
amixer cset numid=3 1
|
||||||
|
amixer sset PCM 100%
|
||||||
|
cat acid2.rb|sonic_pi
|
Loading…
Reference in a new issue