13
0

MCP: remove files no longer used (copies are always available in 2.0-ongoing for historical purposes)

git-svn-id: svn://localhost/ardour2/branches/3.0@11835 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Paul Davis 2012-04-08 20:44:36 +00:00
parent c6c98b6453
commit 6315a979a1
21 changed files with 6 additions and 1342 deletions

View File

@ -1,18 +0,0 @@
For usage, see
http://www.ardour.org/files/manual/sn-mackie.html
unfortunately it's a bit outdated, so to get the latest manual, go to the manual
directory in the ardour source tree, and say "make html" to build the latest.
Then point your favourite browser at tmp/index.html
NOTES:
* support for alsa/sequencer ports is currently broken. We're working on it.
* you'll need to make port changes in etc/ardour3/ardour_system.rc and
etc/ardour3/ardour.rc, otherwise they don't stay changed in ~/.ardour3/ardour.rc
John Anderson
panic@semiosix.com

View File

@ -263,23 +263,22 @@ MackieControlProtocol::switch_banks (int initial)
// DON'T prevent bank switch if initial == _current_initial_bank
// because then this method can't be used as a refresh
// sanity checking
Sorted sorted = get_sorted_routes();
int delta = sorted.size() - route_table.size();
if (initial < 0 || (delta > 0 && initial > delta)) {
DEBUG_TRACE (DEBUG::MackieControl, string_compose ("not switching to %1\n", initial));
return;
}
_current_initial_bank = initial;
// first clear the signals from old routes
// taken care of by the RouteSignal destructors
_current_initial_bank = initial;
clear_route_signals();
// now set the signals for new routes
if (_current_initial_bank <= sorted.size()) {
// fetch the bank start and end to switch to
uint32_t end_pos = min (route_table.size(), sorted.size());
uint32_t i = 0;
Sorted::iterator it = sorted.begin() + _current_initial_bank;
Sorted::iterator end = sorted.begin() + _current_initial_bank + end_pos;
@ -289,7 +288,7 @@ MackieControlProtocol::switch_banks (int initial)
set_route_table_size (surface().strips.size());
// link routes to strips
uint32_t i = 0;
for (; it != end && it != sorted.end(); ++it, ++i) {
boost::shared_ptr<Route> route = *it;
@ -301,8 +300,7 @@ MackieControlProtocol::switch_banks (int initial)
set_route_table (i, route);
RouteSignal * rs = new RouteSignal (route, *this, strip, port_for_id(i));
route_signals.push_back (rs);
// update strip from route
rs->notify_all();
rs->notify_all ();
}
// create dead strips if there aren't enough routes to

View File

@ -1,32 +0,0 @@
#! /usr/bin/ruby
class Bank
attr_accessor :routes, :strips, :current
def initialize( routes = 17, strips = 8, current = 0 )
@routes = routes
@strips = strips
@current = current
end
def left
new_initial = current - routes
if new_initial < 0
new_initial = 0
end
current = new_initial
self
end
def right
delta = routes - ( strips + current ) - 1
puts "delta: #{delta}"
if delta > strips
delta = strips
end
@current += delta
self
end
end
b=Bank.new

View File

@ -1,95 +0,0 @@
type,count,group,name,switch,led,id
# faders
fader,7,strip,gain,1,0,0x00
fader,1,master,gain,1,0,0x07
# pots
pot,7,strip,vpot,1,1,0x10
pot,1,,jog,1,0,0x17
pot,1,,external,1,0,0x2e
# strip buttons
button,7,strip,recenable,1,1,0x18
button,7,strip,solo,1,1,0x20
button,7,strip,mute,1,1,0x10
button,7,strip,select,1,1,0x0
button,7,strip,vselect,1,0,0x08
# overlay buttons
button,1,assignment,io,1,1,0x28
button,1,assignment,sends,1,1,0x5a
button,1,assignment,pan,1,1,0x59
button,1,assignment,plugin,1,1,0x57
button,1,functions,drop,1,1,0x58 # was eq
button,1,assignment,zoom,1,1,0x2d
button,1,bank,left,1,0,0x2e
button,1,bank,right,1,0,0x2f
button,1,bank,channel_left,1,0,0x30
button,1,bank,channel_right,1,0,0x31
button,1,,scrub,1,1,0x32
button,1,,edit,1,1,0x56
button,1,display,name_value,1,0,0x34
button,1,display,smpte_beats,1,0,0x35
button,1,,F1,1,0,0x36
button,1,,F2,1,0,0x37
button,1,,F3,1,0,0x38
button,1,,F4,1,0,0x39
button,1,,F5,1,0,0x3a
button,1,,F6,1,0,0x3b
button,1,,F7,1,0,0x3c
button,1,,F8,1,0,0x3d
button,1,,F9,1,0,0x3e
button,1,,F10,1,0,0x3f
button,1,,F11,1,0,0x40
button,1,,F12,1,0,0x41
button,1,,F13,1,0,0x42
button,1,,F14,1,0,0x43
button,1,,F15,1,0,0x44
button,1,,F16,1,0,0x45
# turn on/off all solos
button,1,,global_solo,1,0,0x27
button,1,modifiers,option,1,0,0x50
button,1,modifiers,cmd_alt,1,0,0x49
button,1,automation,on,1,1,0x4a
button,1,automation,rec_ready,1,1,0x4b
button,1,functions,undo,1,1,0x4c
button,1,automation,snapshot,1,1,0x5f
button,1,functions,redo,1,1,0x4f
button,1,functions,marker,1,1,0x47
button,1,functions,enter,1,1,0x51
button,1,functions,cancel,1,0,0x52
button,1,functions,mixer,1,0,0x53
button,1,functions,save,1,0,0x4d
# transport buttons
button,1,transport,frm_left,1,1,0x5b
button,1,transport,frm_right,1,1,0x5c
button,1,transport,loop,1,1,0x46
button,1,transport,punch_in,1,1,0x48
button,1,transport,punch_out,1,1,0x4e
button,1,transport,home,1,1,0x2a
button,1,transport,end,1,1,0x29
button,1,transport,"rewind",1,1,0x2c
button,1,transport,"ffwd",1,1,0x2b
button,1,transport,"stop",1,1,0x5d
button,1,transport,"play",1,1,0x5e
button,1,transport,"record",1,1,0x1f
button,1,cursor,"cursor_up",1,0,0x60
button,1,cursor,"cursor_down",1,0,0x61
button,1,cursor,"cursor_left",1,0,0x62
button,1,cursor,"cursor_right",1,0,0x63
button,1,,"dyn",1,1,0x64
button,1,,"flip",1,1,0x65
button,1,user,"user_a",1,0,0x66
button,1,user,"user_b",1,0,0x67
button,7,strip,"fader_touch",1,0,0x68
button,1,master,"fader_touch",1,0,0x6f
button,1,master,mute,1,0,0x17
button,1,,clicking,1,1,0x33
button,1,,"smpte",0,1,0x71
button,1,,"beats",0,1,0x72
button,1,,"solo",0,1,0x73
button,1,,"relay_click",0,1,0x76
Can't render this file because it has a wrong number of fields in line 2.

View File

@ -1,216 +0,0 @@
#! /usr/bin/ruby
# Copyright (C) 2006,2007 John Anderson
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
this_dir = File.dirname(__FILE__)
require 'faster_csv'
require "#{this_dir}/mackie.rb"
class Control
attr_accessor :id, :led, :group, :name, :ordinal, :switch
def initialize( obj, group )
@id = obj.id
@name = obj.name
@ordinal = obj.ordinal
@switch = obj.switch
@group = group
end
def ordinal_name
end
end
class Fader < Control
def self.midi_zero_byte
0xe0
end
def self.mask_for_id( bytes )
bytes[0] & 0b00001111
end
end
class Button < Control
def self.midi_zero_byte
0x90
end
def self.mask_for_id( bytes )
bytes[1]
end
end
class Led < Control
end
class LedRing < Led
end
class Pot < Control
def self.midi_zero_byte
0xb0
end
def self.mask_for_id( bytes )
bytes[1] & 0b00011111
end
def led=( rhs )
@led = LedRing.new( rhs, group )
end
end
class Group < Array
attr_accessor :name, :controls
def initialize( name )
@name = name
end
def add_control( control )
@controls ||= Array.new
@controls << control
end
end
class Strip < Group
attr_accessor :ordinal
def initialize( name, ordinal )
super( name )
@ordinal = ordinal
end
def name
@name == 'master' ? @name : "#{@name}_#{@ordinal}"
end
def is_master
name == 'master'
end
end
types = { 0xe0 => Fader, 0x90 => Button, 0xb0 => Pot }
# number of controls, name, switch, led, id
# anything that doesn't have the correct number
# of columns will be ignored
# actually, 'switch' means it generates data
# whereas 'led' means it receives data
class Row
attr_accessor :count, :name, :switch, :led, :start_id, :type, :group
attr_accessor :id, :ordinal_name, :ordinal_group, :ordinal
def initialize( hash )
@count = hash['count'].to_i
@name = hash['name']
@switch = hash['switch'].to_b
@led = hash['led'].to_b
@start_id = hash['id'].hex
@type = hash['type']
@group = hash['group']
@hash = hash
end
def each_ordinal( &block )
for i in 0...count
@ordinal = i + 1
@ordinal_name = count > 1 ? "#{name}_#{ordinal}" : name
@ordinal_group = count > 1 ? "#{group}_#{ordinal}" : group
@id = start_id + i
@hash['ordinal_name'] = @ordinal_name
@hash['ordinal_group'] = @ordinal_group
yield( self )
end
self
end
def to_hash
@hash
end
end
class Surface
attr_reader :groups, :controls_by_id, :types, :midis, :controls, :name
def initialize( name = 'none' )
@name = name
@types = Hash.new
@groups = Hash.new
@controls = Array.new
@controls_by_id = Hash.new
@midis = Hash.new
end
def add_or_create_group( name, ordinal = nil )
if name.nil?
@groups['none'] = Group.new('none')
else
group = name =~ /strip/ || name == 'master' ? Strip.new( name, ordinal ) : Group.new( name )
@groups[group.name] ||= group
end
end
def parse( control_data )
FasterCSV.parse( control_data, :headers => true ) do |csv_row|
next if csv_row.entries.size < 5 || csv_row[0] =~ /^\s*#/ || csv_row['id'].nil?
row = Row.new( csv_row )
row.each_ordinal do |row|
group = add_or_create_group( row.group, row.ordinal )
if row.switch
# for controls
control = eval "#{row.type.capitalize}.new( row, group )"
# for controls with leds
control.led = Led.new( row, group ) if row.led
else
# for LED-only entries
if row.led
control = Led.new( row, group )
control.led = control
end
end
# add the new control to the various lookups
# but first print a warning if the id is duplicated
if @controls_by_id.has_key?( row.id ) && control.group.class != Strip
duplicated = @controls_by_id[row.id]
puts "duplicate id #{control.id}:#{control.name} of #{duplicated.id}:#{duplicated.name}"
end
@controls_by_id[row.id] = control
@controls << control
group << control
# add incoming midi bytes
if row.switch
types[control.class.midi_zero_byte] = control.class
midis[control.class.midi_zero_byte] ||= Hash.new
midis[control.class.midi_zero_byte][row.id] = control
end
end
end
self
end
end

View File

@ -1,11 +0,0 @@
#! /usr/bin/ruby
while !File.exist? ARGV[0]
sleep 0.010
end
file = File.open ARGV[0], 'r'
while bytes = file.sysread( 3 )
puts "%02x %02x %02x" % [ bytes[0], bytes[1], bytes[2] ]
end

View File

@ -1,59 +0,0 @@
<%#
Copyright (C) 2006,2007 John Anderson
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-%>
<%-
require 'controls.rb'
sf = Surface.new
sf.parse( File.open "mackie-controls.csv" )
buttons = sf.controls.find_all{|x| x.class == Button && x.group.class != Strip}
-%>
/*
Generated by scripts/generate-button-handlers.erb
*/
#include "mackie_button_handler.h"
#include "controls.h"
#include <iostream>
using namespace std;
using namespace Mackie;
LedState MackieButtonHandler::default_button_press( Button & button )
{
cout << "press: " << button << endl;
return on;
}
LedState MackieButtonHandler::default_button_release( Button & button )
{
cout << "release: " << button << endl;
return off;
}
<%-
buttons.each do |button|
%>
LedState MackieButtonHandler::<%=button.name%>_press( Button & button )
{
return default_button_press( button );
}
LedState MackieButtonHandler::<%=button.name%>_release( Button & button )
{
return default_button_release( button );
}
<% end %>

View File

@ -1,54 +0,0 @@
<%#
Copyright (C) 2006,2007 John Anderson
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-%>
<%-
require 'controls.rb'
sf = Surface.new
sf.parse( File.open "mackie-controls.csv" )
buttons = sf.controls.find_all{|x| x.class == Button && x.group.class != Strip}
-%>
#ifndef mackie_button_handler_h
#define mackie_button_handler_h
/*
Generated by scripts/generate-button-handlers.erb
*/
#include "types.h"
namespace Mackie
{
class MackieButtonHandler
{
public:
virtual ~MackieButtonHandler() {}
virtual LedState default_button_press( Button & button );
virtual LedState default_button_release( Button & button );
virtual void update_led( Button & button, LedState ls ) = 0;
<%- buttons.each do |button| %>
virtual LedState <%=button.name%>_press( Button & );
virtual LedState <%=button.name%>_release( Button & );
<% end %>
};
}
#endif

View File

@ -1,26 +0,0 @@
#! /usr/bin/ruby
require 'erb'
require File.dirname(__FILE__) + '/controls.rb'
cc_template = ''
File.open( File.dirname(__FILE__) + "/surface-cc-template.erb", "r" ) { |f| cc_template = f.read }
h_template = ''
File.open( File.dirname(__FILE__) + "/surface-h-template.erb", "r" ) { |f| h_template = f.read }
sf = Surface.new( ARGV[0] )
control_data = ''
File.open( File.dirname(__FILE__) + "/#{sf.name.downcase}-controls.csv", "r") { |f| control_data = f.read }
sf.parse control_data
@result = ""
erb = ERB.new( cc_template , 0, "%<>-", "@result" )
erb.result
File.open( "#{sf.name.downcase}_surface.cc", "w" ) { |f| f.write @result }
erb = ERB.new( h_template , 0, "%<>-", "@result" )
erb.result
File.open( "#{sf.name.downcase}_surface.h", "w" ) { |f| f.write @result }

View File

@ -1,106 +0,0 @@
#! /usr/bin/ruby
# Copyright (C) 2006,2007 John Anderson
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
require 'controls.rb'
require 'mackie.rb'
if ARGV.size != 2
puts "#$0 /dev/snd/midiXXXX control-file.csv"
exit 1
end
while !File.exist? ARGV[0]
sleep 0.010
end
#mapping_csv = ARGV[1] || "mackie-controls.csv"
mapping_csv = ARGV[1]
puts "mapping_csv: #{mapping_csv}"
puts ""
file = File.open ARGV[0], 'r+'
mck = Mackie.new( file )
# faders to minimum. bcf2000 doesn't respond
mck.write_sysex "\x61"
# all leds off. bcf2000 doesn't respond
mck.write_sysex "\x62"
# get version. comes back as ASCII bytes
version = mck.sysex "\x13\x00"
puts "version: #{version.map{|x| x.chr}}"
# write a welcome message. bcf2000 responds with exact
# string but doesn't display anything
# 0 offset,
#~ file.write hdr + "\x12\x3fLCDE\xf7"
#~ file.flush
#~ answer = read_sysex file
#~ puts "answer: #{answer[hdr.length..-1].map{|x| x.chr}}"
# write to BBT display
#~ file.write hdr + "\x10LCDE\xf7"
#~ file.flush
#~ bbt = []
#~ while ( nc = file.read( 1 ) )[0] != 0xf7
#~ bbt << nc[0]
#~ end
#~ puts "bbt: #{bbt[hdr.length..-1].map{|x| x.chr}}"
# write 7-segment display
#~ file.write hdr + "\x11LCDE\xf7"
#~ file.flush
# go offline. bcf2000 doesn't respond
#~ file.write( hdr + "\x0f\x7f\xf7" )
#~ file.flush
sf = Surface.new
control_data = ""
File.open( mapping_csv ) { |f| control_data = f.read }
sf.parse( control_data )
# send all faders to 0, but bounce them first
# otherwise the bcf gets confused
sf.midis[0xe0].values.find_all{|x| x.class == Fader}.each do |x|
bytes = Array.new
bytes[0] = 0xe0 + x.ordinal - 1
bytes[1] = 0x1
bytes[2] = 0x1
file.write bytes.pack( 'C*' )
bytes[0] = 0xe0 + x.ordinal - 1
bytes[1] = 0x0
bytes[2] = 0x0
file.write bytes.pack( 'C*' )
end
file.flush
# respond to control movements
while bytes = mck.file.read( 3 )
print "received: %02.x %02.x %02.x" % [ bytes[0], bytes[1], bytes[2] ]
midi_type = bytes[0] & 0b11110000
control_id = sf.types[midi_type].mask_for_id( bytes )
control = sf.midis[midi_type][control_id]
print " Control Type: %-7s, " % sf.types[midi_type]
print "id: %4x" % control_id
print ", control: %15s" % ( control ? control.name : "nil control" )
print ", %15s" % ( control ? control.group.name : "nil group" )
print "\n"
end

View File

@ -1,93 +0,0 @@
type,count,group,name,switch,led,id
# faders
fader,8,strip,gain,1,0,0x00
fader,1,master,gain,1,0,0x08
# pots
pot,8,strip,vpot,1,1,0x10
pot,1,,jog,1,0,0x3c
pot,1,,external,1,0,0x2e
# strip buttons
button,8,strip,recenable,1,1,0x0
button,8,strip,solo,1,1,0x08
button,8,strip,mute,1,1,0x10
button,8,strip,select,1,1,0x18
button,8,strip,vselect,1,0,0x20
# overlay buttons
button,1,assignment,io,1,1,0x28
button,1,assignment,sends,1,1,0x29
button,1,assignment,pan,1,1,0x2a
button,1,assignment,plugin,1,1,0x2b
button,1,assignment,eq,1,1,0x2c
button,1,assignment,dyn,1,1,0x2d
button,1,bank,left,1,0,0x2e
button,1,bank,right,1,0,0x2f
button,1,bank,channel_left,1,0,0x30
button,1,bank,channel_right,1,0,0x31
button,1,,flip,1,1,0x32
button,1,,edit,1,1,0x33
button,1,display,name_value,1,0,0x34
button,1,display,smpte_beats,1,0,0x35
button,1,,F1,1,0,0x36
button,1,,F2,1,0,0x37
button,1,,F3,1,0,0x38
button,1,,F4,1,0,0x39
button,1,,F5,1,0,0x3a
button,1,,F6,1,0,0x3b
button,1,,F7,1,0,0x3c
button,1,,F8,1,0,0x3d
button,1,,F9,1,0,0x3e
button,1,,F10,1,0,0x3f
button,1,,F11,1,0,0x40
button,1,,F12,1,0,0x41
button,1,,F13,1,0,0x42
button,1,,F14,1,0,0x43
button,1,,F15,1,0,0x44
button,1,,F16,1,0,0x45
button,1,modifiers,shift,1,0,0x46
button,1,modifiers,option,1,0,0x47
button,1,modifiers,control,1,0,0x48
button,1,modifiers,cmd_alt,1,0,0x49
button,1,automation,on,1,1,0x4a
button,1,automation,rec_ready,1,1,0x4b
button,1,functions,undo,1,1,0x4c
button,1,automation,snapshot,1,1,0x4d
button,1,automation,touch,1,1,0x4e
button,1,functions,redo,1,1,0x4f
button,1,functions,marker,1,1,0x50
button,1,functions,enter,1,1,0x51
button,1,functions,cancel,1,0,0x52
button,1,functions,mixer,1,0,0x53
button,1,transport,frm_left,1,1,0x54
button,1,transport,frm_right,1,1,0x55
button,1,transport,loop,1,1,0x56
button,1,transport,punch_in,1,1,0x57
button,1,transport,punch_out,1,1,0x58
button,1,transport,home,1,1,0x59
button,1,transport,end,1,1,0x5a
# transport buttons
button,1,transport,"rewind",1,1,0x5b
button,1,transport,"ffwd",1,1,0x5c
button,1,transport,"stop",1,1,0x5d
button,1,transport,"play",1,1,0x5e
button,1,transport,"record",1,1,0x5f
button,1,cursor,"cursor_up",1,0,0x60
button,1,cursor,"cursor_down",1,0,0x61
button,1,cursor,"cursor_left",1,0,0x62
button,1,cursor,"cursor_right",1,0,0x63
button,1,,"zoom",1,1,0x64
button,1,,"scrub",1,1,0x65
button,1,user,"user_a",1,0,0x66
button,1,user,"user_b",1,0,0x67
button,8,strip,"fader_touch",1,0,0x68
button,1,master,"fader_touch",1,0,0x70
button,1,,"smpte",0,1,0x71
button,1,,"beats",0,1,0x72
button,1,,"solo",0,1,0x73
button,1,,"relay_click",0,1,0x76
Can't render this file because it has a wrong number of fields in line 2.

View File

@ -1,119 +0,0 @@
class String
def to_bytes
arr = []
each_byte{|x| arr << x}
arr
end
end
class Array
def to_hex
map{|x| "%2.0x" % x}
end
alias as_hex to_hex
end
class String
def to_b
to_i != 0 || %w{true t yes y}.include?( self.downcase )
end
end
class Fixnum
def to_hex
"%02x" % self
end
end
class Mackie
attr_accessor :file
def initialize( file )
@file = file
end
# send and receive a sysex message
# after wrapping in the header and the eox byte
def sysex( msg )
puts "Mackie write: #{msg.unpack('C*').to_hex.inspect}"
write_sysex( msg )
response = read_sysex
puts "Mackie response: #{response.to_hex.inspect}"
response[5..-1]
end
# returns an array of bytes
def read_sysex
buf = []
while ( nc = @file.read( 1 ) )[0] != 0xf7
buf << nc[0]
end
buf
end
# send and flush a sysex message
# after wrapping in the header and the eox byte
def write_sysex( msg )
@file.write( hdrlc + msg + "\xf7" )
@file.flush
end
def write( msg )
@file.write msg
@file.flush
end
def translate_seven_segment( char )
case char
when 0x40..0x60
char - 0x40
when 0x21..0x3f
char
else
0x00
end
end
# display the msg (which can be only 2 characters)
# append the number of stops. Options are '..', '. ', '. ', ' '
def two_char( msg, stops = ' ' )
two = Array.new
two << translate_seven_segment( msg.upcase[0] )
two << translate_seven_segment( msg.upcase[1] )
two[0] += 0x40 if stops[0] == '.'[0]
two[1] += 0x40 if stops[1] == '.'[0]
midi_msg = [0xb0, 0x4a, two[1], 0x4b, two[0] ]
write midi_msg.pack( 'C*' )
end
# send and receive the device initialisation
def init
response = sysex( "\x00" )
# decode host connection query
status = response[0]
raise( "expected 01, got " + response.inspect ) if status != 1
serial = response[1..7]
challenge = response[8..11]
# send host connection reply
reply = "\x02" + serial.pack('C*') + challenge.pack('C*')
response = sysex reply
# decode host connection confirmation
status = response[0]
raise ( "expected 03, got " + response.inspect ) if status != 3
end
def hdrlc
"\xf0\x00\x00\x66\x10"
end
def hdrlcxt
"\xf0\x00\x00\x66\x11"
end
end

View File

@ -1,61 +0,0 @@
#! /usr/bin/ruby
# Copyright (C) 2006,2007 John Anderson
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
require "rexml/document"
file = File.new( ARGV[0] )
doc = REXML::Document.new file
# fetch the node containing the controls
controls = XPath.first( doc, 'Session/ControlProtocols/Protocol[@name="Generic MIDI"]/controls' )
channel = 1
# A Control is a button or slider. It has an internal ID
# an incoming MIDI message, and an outgoing midi message
class Control
end
# Strips have solo,rec,mute,pan,fader
# Strips have midi input
# Strips have midi output
# Strips have an XML representation, or something like that
class Strip
def initialize( node )
@solo = node.elements['solo']
@mute = node.elements['mute']
@rec = node.elements['recenable']
@fader = node.elements['IO/gaincontrol']
@panner = node.elements['IO/Panner/StreamPanner/panner']
end
end
# This knows how to extract a set of controls from a Route
doc.elements.each( 'Session/Routes/Route' ) do |node|
strip = Strip.new( node )
controls.add_element( 'mute',
'id' => mute.attribute('id').value,
'event' => "0xb0",
'channel' => channel.to_s,
'additional' => "0x41"
)
end
pp controls.elements

View File

@ -1,137 +0,0 @@
#~ /usr/bin/ruby
# Copyright (C) 2006,2007 John Anderson
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
require 'erb'
signals = %w{
solo_changed
mute_changed
record_enable_changed
gain_changed
name_changed
panner_changed
}
@signal_calls = { 'panner_changed' => 'panner()[0]->Changed' }
def connection_call( x )
if @signal_calls.include? x
@signal_calls[x]
else
x
end
end
signals.each do |x|
puts <<EOF
void MackieControlProtocol::notify_#{x}( void *, ARDOUR::Route * route )
{
try
{
strip_from_route( route ).#{x.gsub( /_changed/, '' )}();
}
catch( exception & e )
{
cout << e.what() << endl;
}
}
EOF
end
class_def = <<EOF
#ifndef route_signal_h
#define route_signal_h
#include <sigc++/sigc++.h>
class MackieControlProtocol;
namespace ARDOUR {
class Route;
}
namespace Mackie
{
class Strip;
/**
This class is intended to easily create and destroy the set of
connections from a route to a control surface strip. Instanting
it will connect the signals, and destructing it will disconnect
the signals.
*/
class RouteSignal
{
public:
RouteSignal( ARDOUR::Route & route, MackieControlProtocol & mcp, Strip & strip )
: _route( route ), _mcp( mcp ), _strip( strip )
{
connect();
}
~RouteSignal()
{
disconnect();
}
private:
ARDOUR::Route & _route;
MackieControlProtocol & _mcp;
Strip & _strip;
<% signals.each do |x| -%>
sigc::connection _<%= x %>_connection;
<% end -%>
};
}
#endif
EOF
erb = ERB.new( class_def, 0, ">-" )
erb.run
impl_def = <<EOF
#include "route_signal.h"
#include "ardour/route.h"
#include "ardour/panner.h"
#include "mackie_control_protocol.h"
using namespace Mackie;
void RouteSignal::connect()
{
<% signals.each do |x| -%>
_<%=x%>_connection = _route.<%=connection_call(x)%>.connect( sigc::bind ( mem_fun ( _mcp, &MackieControlProtocol::notify_<%=x%> ), &_route ) );
<% end -%>
}
void RouteSignal::disconnect()
{
<% signals.each do |x| -%>
_<%= x %>_connection.disconnect();
<% end -%>
}
EOF
erb = ERB.new( impl_def, 0, ">-" )
erb.run

View File

@ -1,128 +0,0 @@
#! /usr/bin/ruby
# Copyright (C) 2006,2007 John Anderson
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
require 'mackie'
buttons = {}
pots = {}
while !File.exist? ARGV[0]
sleep 0.010
end
file = File.open( ARGV[0], 'r+' )
#mck = Mackie.new( file )
device = false
# respond to control movements
while bytes = file.read( 3 )
puts "received: %02.x %02.x %02.x" % [ bytes[0], bytes[1], bytes[2] ]
output = nil
case bytes[0] & 0b11110000
when 0xe0
# fader moved, so respond if move is OK
output = bytes
when 0x90
# button pressed
case bytes[1]
when 0x68..0x6f
# do nothing - touch detection
puts "touch detect: %02.x" % bytes[2]
else
# treat all buttons as toggles
button_id = bytes[1]
# only toggle on release. Not working. All buttons send press
# and then release signals
if bytes[2] == 0
if buttons.include?( button_id )
# toggle button state
puts "button id #{buttons[button_id]} to #{!buttons[button_id]}"
buttons[button_id] = !buttons[button_id]
else
# create a new button as on
puts "adding button id #{button_id}"
buttons[button_id] = true
end
bytes[2] = buttons[button_id] ? 0x7f : 0
output = bytes
end
end
when 0xb0
# pots, jog wheel, external
case bytes[1]
when 0x10..0x17
#pot turned
pot_id = bytes[1] & 0b00000111
direction = bytes[2] & 0b01000000
delta = bytes[2] & 0b00111111
sign = direction == 0 ? 1 : -1
if pots.include? pot_id
current_led_pos = pots[pot_id]
else
current_led_pos = pots[pot_id] = 6
end
new_led_pos = current_led_pos + sign
new_led_pos = case
when new_led_pos <= 0
0
when new_led_pos >= 11
11
else
new_led_pos
end
pots[pot_id] = new_led_pos
puts "pot #{pot_id} turned #{sign} #{direction == 0 ? 'clockwise' : 'widdershins'}: %02.x to #{new_led_pos}" % delta
output = bytes
output[1] += 0x20
output[2] = 0b01000000
#~ modes:
#~ 0 - single dot
#~ 1 - boost/cut
#~ 2 - wrap
#~ 3 - spread
mode = pot_id < 4 ? pot_id : 0
output[2] |= ( mode << 4 )
output[2] += ( new_led_pos ) & 0b00001111
when 0x2e
# external controller
when 0x3c
# jog wheel
end
else
puts "don't know what this means"
end
# output bytes
if device && output
#sleep 0.1
puts "sending: %02.x %02.x %02.x" % [ output[0], output[1], output[2] ]
begin
res = file.write output
puts "res: #{res}"
file.flush
rescue => e
puts "oops #{e}"
file.close
file = File.open ARGV[0], 'r+'
end
end
end

View File

@ -1,107 +0,0 @@
<%#
Copyright (C) 2006,2007 John Anderson
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
-%>
/*
Generated by scripts/generate-surface.rb
*/
#include "<%= sf.name.downcase %>_surface.h"
#include "controls.h"
#include "mackie_button_handler.h"
using namespace Mackie;
void Mackie::<%= sf.name %>Surface::init_controls()
{
// intialise groups and strips
Group * group = 0;
// make sure there are enough strips
strips.resize( <%= sf.groups.values.find_all{|x| x.name =~ /strip/}.size %> );
% sf.groups.values.each do |group|
<%- if group.class == Strip -%>
<%- if group.name == 'master' -%>
group = new MasterStrip ( "<%=group.name%>", 0 );
<%- else -%>
group = new <%= group.class.name %> ( "<%=group.name%>", <%=group.ordinal - 1%> );
<%- end -%>
<%- else -%>
group = new <%= group.class.name %> ( "<%=group.name%>" );
<%- end -%>
groups["<%=group.name%>"] = group;
<%- if group.class == Strip -%>
strips[<%=group.ordinal - 1%>] = dynamic_cast<Strip*>( group );
<%- end -%>
% end
// initialise controls
Fader * fader = 0;
Pot * pot = 0;
Button * button = 0;
Led * led = 0;
% sf.controls.each do |control|
<%-
variable_name = control.class.name.downcase
class_name =
if control.name == 'jog'
'Jog'
else
control.class.name
end
-%>
group = groups["<%=control.group.name%>"];
<%= variable_name %> = new <%= class_name %> ( <%= control.id %>, <%= control.ordinal %>, "<%=control.name%>", *group );
<%= variable_name %>s[0x<%=control.id.to_hex %>] = <%= variable_name %>;
controls.push_back( <%= variable_name %> );
<%- if control.group.class != Strip -%>
controls_by_name["<%= control.name %>"] = <%= variable_name %>;
<%- end -%>
group->add( *<%= variable_name %> );
% end
}
void Mackie::<%= sf.name %>Surface::handle_button( MackieButtonHandler & mbh, ButtonState bs, Button & button )
{
if ( bs != press && bs != release )
{
mbh.update_led( button, none );
return;
}
LedState ls;
switch ( button.id() )
{
<%-
buttons = sf.controls.find_all{|x| x.class == Button && x.group.class != Strip}
buttons.each do |button|
%>
case 0x<%= ( button.class.midi_zero_byte << 8 | button.id ).to_hex %>: // <%= button.name %>
switch ( bs ) {
case press: ls = mbh.<%= button.name %>_press( button ); break;
case release: ls = mbh.<%= button.name %>_release( button ); break;
case neither: break;
}
break;
<% end %>
}
mbh.update_led( button, ls );
}

View File

@ -1,27 +0,0 @@
#ifndef mackie_surface_<%= sf.name.downcase %>_h
#define mackie_surface_<%= sf.name.downcase %>_h
/*
Generated by scripts/generate-surface.rb
*/
#include "surface.h"
namespace Mackie
{
class MackieButtonHandler;
class <%= sf.name %>Surface : public Surface
{
public:
<%= sf.name %>Surface( uint32_t max_strips ) : Surface( max_strips )
{
}
virtual void handle_button( MackieButtonHandler & mbh, ButtonState bs, Button & button );
virtual void init_controls();
};
}
#endif

View File

@ -1,9 +0,0 @@
#! /usr/bin/ruby
require 'controls.rb'
require 'pp'
sf = Surface.new
sf.parse( ARGV[0] )
sf.types.each{|k,v| puts "%02.x #{v}" % k}

View File

@ -1,26 +0,0 @@
class ElementHandler
def apply( anElement )
anElement.each {|e| handle(e)} if anElement
end
def handle( aNode )
if aNode.kind_of? REXML::Text
handleTextNode(aNode)
elsif aNode.kind_of? REXML::Element
handle_element aNode
else
return #ignore comments and processing instructions
end
end
def handle_element( anElement )
handler_method = "handle_" + anElement.name.tr("-","_")
if self.respond_to? handler_method
self.send(handler_method, anElement)
else
default_handler(anElement)
end
end
end

View File

@ -1,10 +0,0 @@
#! /usr/bin/ruby
require 'mackie.rb'
@file = File.open '/dev/snd/midiC2D0', 'r+'
@led_8_on = [ 0x90, 0x18, 0x7f ]
@hci = [ 0, 0xf7 ]
@version_req = [ 0x13, 0, 0xf7 ]