Simulation of the Gravity Beats app
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
This repo is archived. You can view files and clone it, but cannot push or open issues/pull-requests.

86 lines
1.7 KiB

//
// Beat.h
// GravityBeats
//
// Created by Joshua Moerman on 1/9/13.
// Copyright (c) 2013 Vadovas. All rights reserved.
//
#ifndef GravityBeats_Beat_h
#define GravityBeats_Beat_h
#include <vector>
#include <cmath>
#include "UserInformation.h"
template <typename Information>
struct Note : public UserInformation<Information>{
// see http://en.wikipedia.org/wiki/Note_value
enum Speed {
kWholeNote =1, // 1 in one measure
kHalfNote =2, // 2 in one measure
kTriplet =3, // 3 in one measure
kQuarterNote =4, // 4
kHalfTriplet =6, // 6
kEighthNote =8 // 8
} speed;
int progress = -2;
template <typename... S>
Note(Speed speed, S... args)
: UserInformation<Information>(args...)
, speed(speed)
{}
// we could return how much it is off, to give the balls the right initial position and speed.
bool update(float time_in_measure){
int new_progress = std::floor(time_in_measure*speed);
if(new_progress != progress){
if(progress == -2){
progress = new_progress;
return false;
} else {
progress = new_progress;
return true;
}
}
return false;
}
void reset(){
progress = -1;
}
};
template <typename NoteInformation>
struct Beat {
float total_length{4.0}; // 60 bpm
float time{-0.1};
std::vector<Note<NoteInformation>> notes;
std::vector<NoteInformation> update(float dt){
std::vector<NoteInformation> ret;
time += dt;
// not needed, but keeps the floats small
// also usefull when we want to change bpm
if(time > total_length){
time -= total_length;
for(auto& n : notes){
n.reset();
}
}
for(auto& n : notes){
if(n.update(time / total_length)){
ret.push_back(n.information);
}
}
return ret;
}
};
#endif