Subversion Repositories DIN Is Noise

Rev

Rev 1528 | Rev 1547 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | RSS feed

/*
* drone.h
* DIN Is Noise is copyright (c) 2006-2020 Jagannathan Sampath
* For more information, please visit https://dinisnoise.org/
*/


#ifndef __drone__
#define __drone__

#include "fader.h"
#include "solver.h"
#include "play.h"
#include "trail.h"
#include "alarm.h"
#include "modulator.h"
#include "noiser.h"
#include "container.h"
#include <string>
#include <map>
#include <ostream>

extern int DRONE_HANDLE_SIZE;
extern int TRAIL_LENGTH;
extern int BOTTOM;
extern float DELTA_VOLUME;
extern float ARROW_U, ARROW_V;

struct din;
struct drone;

typedef std::list<drone*>::iterator drone_iterator;

/*struct connect {
  int dirty;
  drone* d1;
  drone* d2;
  point<float> p1, p2;
  double mag;
  connect (drone* _d1, drone* _d2);
  int eval (drone** ret);
  void draw ();
  void align_vel ();
};*/


struct attractee {
  int id;
  drone* d;
  attractee (int _id = -1, drone* _d = 0) {id = _id; d = _d;}
  bool operator== (const attractee& ae) {return (d == ae.d);}
};

struct drone {

  static int UID; // unique drone id
  int id; // id of this drone

  play player; // player for this drone
  solver sol; // solver for this drone

  float step; // determines pitch (see note.h)
  float vol; // actual volume
 
  int range; // range number on microtonal-keyboard
  float pos; // position in range (0 - left, 1 - right, can go < 0 & > 1 too)

  int sel; // selected?

  // visual
  //
  float cx, cy; // unmodulated position
  float x, y; // current position
  float mx, my;
  float sx; // snapped x (used for note snap)
  int snap; // snap to range edge?
  int dy; // height from microtonal-keyboard bottom
  float xv, yv; // position of velocity vector tip
  float xa, ya; // position of acceleration vector tip
  float r, g, b; // color
  trail_t trail; // trail points
  box<int> handle; // for picking
  int handle_size;
  struct arrowt {
    float u, v;
    arrowt () { reset (); }
    void reset () {u = ARROW_U; v = ARROW_V; }
  } arrow;

  /*struct lblofft {
    float x, y;
    lblofft (float xx = 5, float yy = 0) { x  = xx; y = yy; }
  } lbloff;*/

 
  void calc_handle ();

  static float stiff;
  int conn;
  std::list<drone*> connections;
  std::list<double> mags;
  enum {LINK=0, CHAIN=1};
  int type;
  drone* eval_conns ();


  // states
  enum {DEAD=0, RISING, FALLING, ACTIVE};
  int state; // current state
  int frozen; // frozen?
  int freeze ();
  int thaw ();
  double froze_at; // time when frozen
  void handle_time_pass ();
  fader fdr; // for rising/falling -> fade in/out

  modulator mod; // modulation

  // orbitals & rocketry
  //
  int attractor; // attractor?
  int orbiting; // orbiting?
  std::list<attractee> attractees; // list of drones attracted by this drone
  float V; // speed
  float vx, vy; // velocity vector
  float vxi, vyi;
  float v_mult; // multiplier for velocity vector used in orbit insertion
  float A; // acceleration
  float ax, ay; // acceleration unit vector
  float xi, yi; // interim position
  double insert; // time to insert into orbit

  int gravity; // accelerated by gravity?

  int bounces; // number of bounces from bottom of microtonal-keyboard

  int launcher; // launches drones?
  alarm_t launch_every; // alarm time in seconds
  int dpm; // drones per minute

  enum {NONE, POINT, USE};
  int tracking; // is the launcher tracking a drone?
  drone* tracked_drone; // the tracked drone

  // for launched drone
  static double LIFE_TIME, INSERT_TIME;
  double birth; // time at birth
  double life; // time until death
  drone* launched_by;

  // targets for launchers to launch drones to
  std::vector<drone*> targets;
  int cur_target;
  int num_targets;
  void clear_targets ();
  drone* target;

  static int ref; // for debug

  drone (int _bottom = 0);
  ~drone();

  void set_xy (float x, float y);
  void set_center (float _cx, float _cy);
  void move_center ();


  void change_depth (int i, int what, float delta);
  void change_bpm (int i, int what, float delta);
  void change_bpm (mod_params& mp, float delta);

  enum {INTERPOLATE=1, EMPLACE};
  int update_pv;
  void update_pitch_volume (float dmv);

  int is;
  noiser nsr;

  static std::map<drone*,bool> proc_conn;

};

struct group {
  int n;
  std::vector<drone*> drones;
  group () {n = 0;}
  group (std::vector<drone*> mem, int n);
  int member (drone* d) {
    std::vector<drone*>::iterator db = drones.begin (), de = drones.end();
    if (find (db, de, d) == de) return 0; else return 1;
  }
  int remove (drone* d) {
    if (erase (drones, d)) {
      --n;
      return 1;
    }
    return 0;
  }
};

struct drone_pendulum_group : group {
  int orient;
  int depth;
  drone_pendulum_group (int o = 0, int d = 0) { orient = o; depth = d;}
  drone_pendulum_group (int o, int d, std::vector<drone*> mem, int n) : group (mem, n), orient(o), depth(d)  {}
};

std::ostream& operator<< (std::ostream& f, drone::arrowt& aw);

#endif