https://youtu.be/uZhG5TCbucM
using UnityEngine;
using System.Collections;
using ProceduralToolkit;
using System.Collections.Generic;
using System.IO;
public class Fibo_Spawner : MonoBehaviour
{
StreamWriter sWrite;
public GameObject preFab;
public ArgosMeshDraft_Fibonacci AMD_Base;
List<GameObject> gO_List = new List<GameObject>();
public int iSpwanLoc = 205;
public int iDelt = 8;
public float pathTime = 10f;
public int numPoints = 10;
// Use this for initialization
void Start()
{
sWrite = new StreamWriter("Fibo_Spawner.cs.txt");
}
public void onButtonDown()
{
Quaternion q;
GameObject gO;
GameObject gFibSphere = GameObject.Find("Fibonacci_Sphere");
ArgosFibonacci aF = gFibSphere.GetComponent<ArgosFibonacci>();
AMD_Base = aF.aMF_Base;
q = Quaternion.LookRotation(AMD_Base.funcVerts[iSpwanLoc].vPos.normalized);
gO = (GameObject)Instantiate(preFab, AMD_Base.funcVerts[iSpwanLoc].vPos, q);
gO_List.Add(gO);
List<Vector3> toVList = new List<Vector3>();
gO.GetComponent<Fibo_Rider>().initFromSpawner(iSpwanLoc, iDelt, numPoints, pathTime);
}
// Update is called once per frame
void Update()
{
}
}

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;
using ForieroEngine.MIDIUnified;
public delegate void TimeKeeperBeatDelegate(int beat, int beatNumerator, int beatDenominator);
public class TimeKeeper : MonoBehaviour, IMidiEvents{
public event ShortMessageEventHandler ShortMessageEvent;
float msElapsed = 0f;
void Update(){
msElapsed += Time.deltaTime;
if(msElapsed*1000f >= ms) {
OnInternalTimer();
msElapsed = (msElapsed*1000f % (float)ms)/1000f;
}
}
static TimeKeeper singleton;
public static int beat = 0;
static int beatsNumerator = 4;
static int beatsDenominator = 4;
public static int beatsPerMinute = 60;
public static int upBeatVolume = 80;
public static int downBeatVolume = 60;
public static int ms = 1000;
public static event TimeKeeperBeatDelegate OnBeat;
public static event TimeKeeperBeatDelegate OnStart;
public static event TimeKeeperBeatDelegate OnStop;
public static event TimeKeeperBeatDelegate OnChange;
public static int BeatsPerMinuteToMS(int beatsPerMinute){
return Mathf.RoundToInt(60000/beatsPerMinute);
}
public static int MSToBeatsPerMinute(int ms){
return Mathf.RoundToInt(60000/ms);
}
public static float GetTimeInterval(){
return (float)ms/1000f;
}
public static void SetBeats(int aBeatsNumerator){
beatsNumerator = aBeatsNumerator;
if(OnChange != null) OnChange(beat, beatsNumerator, beatsDenominator);
}
public static bool IsRunning(){
return singleton != null;
}
public static void SetBeatsPerMinute(int aBeatsPerMinute){
beatsPerMinute = aBeatsPerMinute;
ms = BeatsPerMinuteToMS(beatsPerMinute);
if(OnChange != null) OnChange(beat, beatsNumerator, beatsDenominator);
}
public static void Start(int aBeatsNumerator, int aBeatsDenominator, int aBeatsPerMinute){
Stop();
if(!singleton) {
singleton = new GameObject("TimeKeeper").AddComponent<TimeKeeper>();
}
beat = 0;
beatsNumerator = aBeatsNumerator;
beatsDenominator = aBeatsDenominator;
beatsPerMinute = aBeatsPerMinute;
ms = BeatsPerMinuteToMS(beatsPerMinute);
Debug.Log(ms);
if(OnStart != null) OnStart(beat, beatsNumerator, beatsDenominator);
}
public static void Stop(){
if(singleton) {
Destroy(singleton.gameObject);
singleton = null;
}
if(OnStop != null) OnStop(beat, beatsNumerator, beatsDenominator);
}
static void OnInternalTimer(){
beat++; if(beat > beatsNumerator) beat = 1;
if(OnBeat != null) OnBeat(beat, beatsNumerator, beatsDenominator);
}
public static void BeatEvent(int aBeat, int aBeatsNumerator, int aBeatsDenominator){
if(OnBeat != null) OnBeat(aBeat, aBeatsNumerator, aBeatsDenominator);
}
public static void PlayBeat(int aBeat){
MidiOut.fireMidiOutEvents = false;
if(aBeat == 1) MidiOut.NoteOn((int)PercussionEnum.OpenHiHat, downBeatVolume, 9);
else MidiOut.NoteOn((int)PercussionEnum.SideStick, upBeatVolume, 9);
MidiOut.fireMidiOutEvents = true;
}
}
https://noteworthycomposer.com/composer/download.htm
https://kode54.net/bassmididrv/BASSMIDI_Driver_Installation_and_Configuration.htm
https://kode54.net/bassmididrv/#bassmididriverscreenshots
Idea: 12 rings rotating on cosahedron axes.
sin/cos on x/y projection – axis aligned

