aboutsummaryrefslogtreecommitdiffstats
path: root/src/engine/machina
diff options
context:
space:
mode:
authorDavid Robillard <d@drobilla.net>2007-03-03 04:40:05 +0000
committerDavid Robillard <d@drobilla.net>2007-03-03 04:40:05 +0000
commit43cca924857a2c9b8833d0f3e441a5d277ad42fe (patch)
tree86591a16c7f44674dbb264d245151086474995bd /src/engine/machina
parent085f3de0f526ac2ad7b00bfbc76be18b33a5c3c5 (diff)
downloadmachina-43cca924857a2c9b8833d0f3e441a5d277ad42fe.tar.gz
machina-43cca924857a2c9b8833d0f3e441a5d277ad42fe.tar.bz2
machina-43cca924857a2c9b8833d0f3e441a5d277ad42fe.zip
SMF writing work.
git-svn-id: http://svn.drobilla.net/lad/machina@343 a436a847-0d15-0410-975c-d299462d15a1
Diffstat (limited to 'src/engine/machina')
-rw-r--r--src/engine/machina/Action.hpp9
-rw-r--r--src/engine/machina/Engine.hpp1
-rw-r--r--src/engine/machina/JackDriver.hpp8
-rw-r--r--src/engine/machina/Machine.hpp13
-rw-r--r--src/engine/machina/MidiAction.hpp10
-rw-r--r--src/engine/machina/MidiDriver.hpp6
-rw-r--r--src/engine/machina/Node.hpp6
7 files changed, 30 insertions, 23 deletions
diff --git a/src/engine/machina/Action.hpp b/src/engine/machina/Action.hpp
index 16c9b58..9ea106a 100644
--- a/src/engine/machina/Action.hpp
+++ b/src/engine/machina/Action.hpp
@@ -20,18 +20,21 @@
#include <string>
#include <iostream>
-#include <raul/Deletable.h>
+#include <raul/MIDISink.h>
#include <raul/TimeSlice.h>
#include <raul/Stateful.h>
+#include <raul/SharedPtr.h>
#include "types.hpp"
namespace Machina {
+class MidiDriver;
+
/** An Action, executed on entering or exiting of a state.
*/
struct Action : public Raul::Deletable, public Raul::Stateful {
- virtual void execute(Raul::BeatTime /*time*/) {}
+ virtual void execute(SharedPtr<Raul::MIDISink> sink, Raul::BeatTime time) = 0;
virtual void write_state(Raul::RDFWriter& writer);
};
@@ -41,7 +44,7 @@ class PrintAction : public Action {
public:
PrintAction(const std::string& msg) : _msg(msg) {}
- void execute(Raul::BeatTime time)
+ void execute(SharedPtr<Raul::MIDISink>, Raul::BeatTime time)
{ std::cout << "t=" << time << ": " << _msg << std::endl; }
private:
diff --git a/src/engine/machina/Engine.hpp b/src/engine/machina/Engine.hpp
index 37aa2db..32fab23 100644
--- a/src/engine/machina/Engine.hpp
+++ b/src/engine/machina/Engine.hpp
@@ -38,6 +38,7 @@ public:
SharedPtr<Machine> machine() { return _driver->machine(); }
SharedPtr<Machine> load_machine(const Glib::ustring& uri);
+ SharedPtr<Machine> learn_midi(const Glib::ustring& uri);
void set_bpm(double bpm);
void set_quantization(double beat_fraction);
diff --git a/src/engine/machina/JackDriver.hpp b/src/engine/machina/JackDriver.hpp
index 91f4106..0754741 100644
--- a/src/engine/machina/JackDriver.hpp
+++ b/src/engine/machina/JackDriver.hpp
@@ -21,6 +21,7 @@
#include <raul/JackDriver.h>
#include <raul/SharedPtr.h>
#include <raul/DoubleBuffer.h>
+#include <raul/Semaphore.h>
#include <jack/midiport.h>
#include "Machine.hpp"
#include "MidiDriver.hpp"
@@ -45,12 +46,12 @@ public:
void attach(const std::string& client_name);
void detach();
- SharedPtr<Machine> machine() { return _machine; }
- void set_machine(SharedPtr<Machine> machine) { _machine = machine; }
+ SharedPtr<Machine> machine() { return _machine; }
+ void set_machine(SharedPtr<Machine> machine);
void write_event(Raul::BeatTime time,
size_t size,
- const unsigned char* event);
+ const unsigned char* event) throw (std::logic_error);
void set_bpm(double bpm) { _bpm.set(bpm); }
void set_quantization(double quantization) { _quantization.set(quantization); }
@@ -60,6 +61,7 @@ private:
const Raul::TimeSlice& time);
virtual void on_process(jack_nframes_t nframes);
+ Raul::Semaphore _machine_changed;
SharedPtr<Machine> _machine;
SharedPtr<Machine> _last_machine;
diff --git a/src/engine/machina/Machine.hpp b/src/engine/machina/Machine.hpp
index 7b71d01..12b601d 100644
--- a/src/engine/machina/Machine.hpp
+++ b/src/engine/machina/Machine.hpp
@@ -61,16 +61,19 @@ public:
typedef Raul::List<SharedPtr<Node> > Nodes;
const Nodes& nodes() { return _nodes; }
+ void set_sink(SharedPtr<Raul::MIDISink> sink);
+
private:
// Audio context
SharedPtr<Node> earliest_node() const;
- void exit_node(const SharedPtr<Node>);
+ void exit_node(const SharedPtr<Raul::MIDISink> sink, const SharedPtr<Node>);
- bool _is_activated;
- bool _is_finished;
- Raul::BeatTime _time;
- Nodes _nodes;
+ WeakPtr<Raul::MIDISink> _sink;
+ bool _is_activated;
+ bool _is_finished;
+ Raul::BeatTime _time;
+ Nodes _nodes;
//Raul::List<SharedPtr<LearnRequest> > _pending_learns;
SharedPtr<LearnRequest> _pending_learn;
diff --git a/src/engine/machina/MidiAction.hpp b/src/engine/machina/MidiAction.hpp
index b62d841..2a9f91d 100644
--- a/src/engine/machina/MidiAction.hpp
+++ b/src/engine/machina/MidiAction.hpp
@@ -25,9 +25,9 @@
#include "types.hpp"
#include "Action.hpp"
-namespace Machina {
+namespace Raul { class MIDISink; }
-class MidiDriver;
+namespace Machina {
class MidiAction : public Action {
@@ -43,11 +43,9 @@ public:
return ret;
}
- static void set_driver(SharedPtr<MidiDriver> driver);
-
bool set_event(size_t size, const byte* event);
- void execute(Raul::BeatTime time);
+ void execute(SharedPtr<Raul::MIDISink> driver, Raul::BeatTime time);
virtual void write_state(Raul::RDFWriter& writer);
@@ -55,8 +53,6 @@ private:
MidiAction(size_t size,
const unsigned char* event);
- static WeakPtr<MidiDriver> _driver;
-
size_t _size;
const size_t _max_size;
Raul::AtomicPtr<byte> _event;
diff --git a/src/engine/machina/MidiDriver.hpp b/src/engine/machina/MidiDriver.hpp
index a4d9f51..a4d712c 100644
--- a/src/engine/machina/MidiDriver.hpp
+++ b/src/engine/machina/MidiDriver.hpp
@@ -18,6 +18,7 @@
#ifndef MACHINA_MIDIDRIVER_HPP
#define MACHINA_MIDIDRIVER_HPP
+#include <raul/TimeSlice.h>
#include "machina/types.hpp"
namespace Machina {
@@ -25,14 +26,15 @@ namespace Machina {
class Node;
-class MidiDriver {
+class MidiDriver : public Raul::MIDISink {
public:
virtual ~MidiDriver() {}
/** Emit a MIDI event at the given time */
- virtual void write_event(Raul::BeatTime time,
+ /*virtual void write_event(Raul::BeatTime time,
size_t size,
const unsigned char* event) = 0;
+ */
/** Beginning of current cycle in absolute time.
*/
diff --git a/src/engine/machina/Node.hpp b/src/engine/machina/Node.hpp
index 569a54e..bd1a66e 100644
--- a/src/engine/machina/Node.hpp
+++ b/src/engine/machina/Node.hpp
@@ -22,7 +22,7 @@
#include <raul/SharedPtr.h>
#include <raul/List.h>
#include <raul/Stateful.h>
-#include <raul/TimeSlice.h>
+#include <raul/MIDISink.h>
#include "Action.hpp"
namespace Machina {
@@ -52,8 +52,8 @@ public:
void add_exit_action(SharedPtr<Action> action);
void remove_exit_action(SharedPtr<Action> action);
- void enter(BeatTime time);
- void exit(BeatTime time);
+ void enter(SharedPtr<Raul::MIDISink> driver, BeatTime time);
+ void exit(SharedPtr<Raul::MIDISink> driver, BeatTime time);
void add_outgoing_edge(SharedPtr<Edge> edge);
void remove_outgoing_edge(SharedPtr<Edge> edge);