summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTim Redfern <tim@gray.(none)>2012-11-02 17:19:17 +0000
committerTim Redfern <tim@gray.(none)>2012-11-02 17:19:17 +0000
commit2ea0f60bb2ca981ff1e72575dd92c4ab906fd1c7 (patch)
tree559b3a70c0f378e30bc641e134304a77191dcc1b
parenta0eff6b1806e7a99edde8714fbb4f3330fc87a61 (diff)
syncing and drawing notes
-rwxr-xr-xvfg/bin/data/flake.pngbin0 -> 4570 bytes
-rwxr-xr-xvfg/src/music.cpp109
-rwxr-xr-xvfg/src/music.h37
-rwxr-xr-xvfg/src/testApp.cpp11
-rwxr-xr-xvfg/vfg.cbp76
-rw-r--r--vfg/vfg.layout12
6 files changed, 178 insertions, 67 deletions
diff --git a/vfg/bin/data/flake.png b/vfg/bin/data/flake.png
new file mode 100755
index 0000000..b609837
--- /dev/null
+++ b/vfg/bin/data/flake.png
Binary files differ
diff --git a/vfg/src/music.cpp b/vfg/src/music.cpp
index 82e953e..74c5c0b 100755
--- a/vfg/src/music.cpp
+++ b/vfg/src/music.cpp
@@ -1,12 +1,19 @@
#include "music.h"
//event times & durations are absolute integer milliseconds
-
+//---------------------------------------------------------------------------------------------------------------------------------------------
note::note(int n,int v,int d){
num=n;
velocity=v;
duration=d;
}
+//---------------------------------------------------------------------------------------------------------------------------------------------
+//---------------------------------------------------------------------------------------------------------------------------------------------
+musicscore::musicscore() {
+ timeframe=10000;
+ flake.loadImage("flake.png");
+ flake.setAnchorPercent(0.5,0.5);
+}
void musicscore::parseMidi(string filename){
// millis = 60000 / (BPM * PPQ)
// BPM = 60000000 / MQPN (last 3 bytes of midi tempoSet)
@@ -21,11 +28,11 @@ void musicscore::parseMidi(string filename){
//input:: MPQN :: default 500000
float MPQN=60000000.0f/BPM;
//unknown:: ticks per quarter note
- int TPQN=96;
+ int TPQN=480;
//want:: seconds per tick in float
float SPT =(MPQN/1000000.0f)/TPQN;
- float time=0; //counts up in float seconds but converts to millis for map index
+ float time=0; //counts up in float seconds to avoid rounding errors but converts to millis for map index
map<int,note*> events;
@@ -65,27 +72,97 @@ void musicscore::parseMidi(string filename){
//iterate events and compute durations now the absolute times are established: extract to notes
map<int,note*>::iterator iter1;
map<int,note*>::iterator iter2;
-
+ int note;
+ bool started=false;
for (iter1 = events.begin(); iter1 != events.end(); ++iter1) {
- if (iter1->second->duration==144) {
+ if (iter1->second->duration==144) {
+ if (!started) {
+ note=iter1->second->num;
+ started=true;
+ }
iter1->second->duration=0;
iter2=iter1;
while (++iter2 != events.end()) {
- if ((iter1->second->num==iter2->second->num)&&(iter2->second->duration==128)) {
- iter1->second->duration=iter2->first-iter1->first;
- notes[iter1->first]=iter1->second;
- //printf("%i: noteon %i %i\n",iter1->first,iter1->second->num,iter1->second->duration);
- break;
- }
- }
+ if ((iter1->second->num==iter2->second->num)&&(iter2->second->duration==128)) {
+ iter1->second->duration=iter2->first-iter1->first;
+ iter1->second->updown=iter1->second->num<note?-1:iter1->second->num==note?0:1;
+ note=iter1->second->num;
+ notes[iter1->first]=iter1->second;
+ printf("%i: noteon %i %i %i\n",iter1->first,iter1->second->num,iter1->second->duration,iter1->second->updown);
+ break;
+ }
+ }
}
- }
- printf("processed %s: %i notes in %f seconds\n",filename.c_str(),notes.size(),ofGetElapsedTimef()-wt);
-}
+ }
+ iter1 = notes.end();
+ iter1--;
+ printf("processed %s: length %f, %i notes in %f seconds\n",filename.c_str(),((float)(iter1->first+iter1->second->duration)*.001f),notes.size(),ofGetElapsedTimef()-wt);
+ //decimate notes to generate flakes that can be interacted with
+
+}
+void musicscore::setTimeframe(int millis) {timeframe=millis;}
+void musicscore::draw() {
+ ofEnableAlphaBlending();
+ int scoreStart=ofGetElapsedTimeMillis()-startTime;
+ int scoreEnd=scoreStart+timeframe;
+ //temporary drawing method 46h - 52h
+ int numnotes=16;
+ int firstnote=70;
+ float widthStep=((float)ofGetWidth())/numnotes;
+ float heightStep=((float)ofGetHeight())/timeframe;
+ map<int,note*>::iterator iter;
+ for (iter = notes.lower_bound(scoreStart); iter != notes.upper_bound(scoreEnd); ++iter) {
+ int thisnote=iter->second->num-firstnote;
+ int thisstart=iter->first-scoreStart;
+ int thislength=iter->second->duration;
+ ofSetColor(ofColor::fromHsb(((float)thisnote*255)/numnotes,200,100));
+ ofRect(thisnote*widthStep,ofGetHeight()-(thisstart*heightStep),widthStep,-(thislength*heightStep));
+ ofSetColor(ofColor::fromHsb(((float)thisnote*255)/numnotes,200,255));
+
+ //different methods for generating flakes
+ //ideally theres a variable clumping factor, this means pre-processing the flakes though
+
+ //flake.draw((thisnote+0.5f)*widthStep,ofGetHeight()-(thisstart*heightStep));
+ //flake.draw((iter->second->updown*ofGetWidth()*0.33)+(ofGetWidth()*0.5),ofGetHeight()-(thisstart*heightStep));
+ flake.draw((((thisnote/5)*5)+3.5f)*widthStep,ofGetHeight()-(thisstart*heightStep));
+ }
+ ofDisableAlphaBlending();
+}
+//---------------------------------------------------------------------------------------------------------------------------------------------
song::song(string backfile,string melfile,string notefile) {
backing.loadSound(backfile);
melody.loadSound(melfile);
notes.parseMidi(notefile);
- bpm=bpm; //can be used to set tempo eventually? keeps everything simple to do it this way
+ isPlaying=false;
+}
+void song::setTimeframe(int millis) {notes.setTimeframe(millis);}
+void song::play() {
+ backing.play();
+ melody.play();
+ startTime=ofGetElapsedTimeMillis();
+ notes.startTime=startTime;
+ isPlaying=true;
+}
+void song::stop() {
+ backing.stop();
+ melody.stop();
+ isPlaying=false;
+}
+void song::preRoll(long preroll) {
+ startTime=ofGetElapsedTimeMillis()+preroll;
+ notes.startTime=startTime;
+ isPreroll=true;
+ isPlaying=true;
+}
+void song::draw(){
+ //how to deal with end/ track length/ part of game?
+ if (isPreroll) {
+ if (startTime<ofGetElapsedTimeMillis()) {
+ backing.play();
+ melody.play();
+ isPreroll=false;
+ }
+ }
+ notes.draw();
}
diff --git a/vfg/src/music.h b/vfg/src/music.h
index 145538e..ecec8f2 100755
--- a/vfg/src/music.h
+++ b/vfg/src/music.h
@@ -4,52 +4,59 @@
#include "ofxXmlSettings.h"
//event times are absolute integer milliseconds
-
+//---------------------------------------------------------------------------------------------------------------------------------------------
class note {
public:
note(int n,int v,int d=0);
int num;
int velocity;
int duration; //may be needed another time?
+ int updown; //-1 0 1 used for 3-button interaction
};
-
+//---------------------------------------------------------------------------------------------------------------------------------------------
class score {
- //implements basics of timelime, loading from xml, time, checking
+ //basics of timelime
public:
-
+ long startTime;
protected:
ofxXmlSettings XML;
};
-
+//---------------------------------------------------------------------------------------------------------------------------------------------
class lyricscore: public score {
//draws lyrics to screen for a certain time
public:
};
-
+//---------------------------------------------------------------------------------------------------------------------------------------------
class musicscore: public score {
//draws notes to screen for a certain time and certain parameters, checks when they become ready
- //how will it be played dictates how the data is stored
- //play : start from beginning, schedule event at next delta
- //end : clean up and start again
- //you can set position of sound file, it will seek. will we want ffwd at any stage
- //when it comes to drawing, we will want to repeatedly retrieve notes in a range of times
- //lower_bound and upper_bound
public:
+ musicscore();
void parseMidi(string filename);
+ void setTimeframe(int millis);
+ void draw();
private:
map<int,note*> notes;
+ int timeframe;
+ ofImage flake;
};
-
+//---------------------------------------------------------------------------------------------------------------------------------------------
class song {
public:
song(string backfile,string melfile,string musfile);
+ void play();
+ void stop();
+ void preRoll(long preroll);
+ void setTimeframe(int millis);
+ void draw();
+ bool isPlaying;
private:
ofSoundPlayer backing;
ofSoundPlayer melody;
lyricscore lyrics;
musicscore notes;
- int bpm;
+ long startTime;
+ bool isPreroll;
};
-
+//---------------------------------------------------------------------------------------------------------------------------------------------
diff --git a/vfg/src/testApp.cpp b/vfg/src/testApp.cpp
index 7710326..675baef 100755
--- a/vfg/src/testApp.cpp
+++ b/vfg/src/testApp.cpp
@@ -3,6 +3,11 @@
//--------------------------------------------------------------
void testApp::setup(){
testsong=new song("VODA_MUS_DeckTheHalls-Backing_v.1.3.mp3","VODA_MUS_DeckTheHalls-Melody_v.1.3.mp3","MIDI_DeckTheHalls_Test.1.3.xml");
+ testsong->setTimeframe(1500);
+ testsong->preRoll(250);
+
+ ofSetBackgroundAuto(false);
+ ofBackground(0,0,0);
}
void testApp::exit(){
@@ -15,7 +20,11 @@ void testApp::update(){
//--------------------------------------------------------------
void testApp::draw(){
-
+ ofEnableAlphaBlending();
+ //ofBackground(0,0,0,0.1);
+ ofSetColor(0,0,0,100);
+ ofRect(0,0,ofGetWidth(),ofGetHeight());
+ if (testsong->isPlaying) testsong->draw();
}
//--------------------------------------------------------------
diff --git a/vfg/vfg.cbp b/vfg/vfg.cbp
index f982225..18e5af4 100755
--- a/vfg/vfg.cbp
+++ b/vfg/vfg.cbp
@@ -1,4 +1,4 @@
-<?xml version="1.0"?>
+<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_project_file>
<FileVersion major="1" minor="6" />
<Project>
@@ -6,7 +6,7 @@
<Option makefile_is_custom="1" />
<Option pch_mode="2" />
<Option compiler="gcc" />
- <Option virtualFolders="addons/;src/;" />
+ <Option virtualFolders="addons/;src/;build config/;addons/ofxNetwork/src/;addons/ofxXmlSettings/libs/;addons/ofxXmlSettings/src/;" />
<Build>
<Target title="Debug">
<Option output="bin/$(PROJECT_NAME)_debug" prefix_auto="1" extension_auto="1" />
@@ -27,70 +27,76 @@
<Option projectLinkerOptionsRelation="2" />
</Target>
</Build>
+ <Unit filename="config.make">
+ <Option virtualFolder="build config" />
+ </Unit>
<Unit filename="src/main.cpp">
<Option virtualFolder="src/" />
</Unit>
- <Unit filename="src/testApp.cpp">
+ <Unit filename="src/music.cpp">
<Option virtualFolder="src/" />
</Unit>
- <Unit filename="src/testApp.h">
+ <Unit filename="src/music.h">
<Option virtualFolder="src/" />
</Unit>
- <Unit filename="config.make">
- <Option virtualFolder="build config" />
- </Unit>
- <Extensions>
- <code_completion />
- <envvars />
- <debugger />
- </Extensions>
- <Unit filename="../../openFrameworks/addons/ofxXmlSettings/src/ofxXmlSettings.cpp">
- <Option virtualFolder="addons/ofxXmlSettings/src" />
- </Unit>
- <Unit filename="../../openFrameworks/addons/ofxXmlSettings/src/ofxXmlSettings.h">
- <Option virtualFolder="addons/ofxXmlSettings/src" />
- </Unit>
- <Unit filename="../../openFrameworks/addons/ofxXmlSettings/libs/tinyxmlparser.cpp">
- <Option virtualFolder="addons/ofxXmlSettings/libs" />
- </Unit>
- <Unit filename="../../openFrameworks/addons/ofxXmlSettings/libs/tinyxml.cpp">
- <Option virtualFolder="addons/ofxXmlSettings/libs" />
- </Unit>
- <Unit filename="../../openFrameworks/addons/ofxXmlSettings/libs/tinyxmlerror.cpp">
- <Option virtualFolder="addons/ofxXmlSettings/libs" />
+ <Unit filename="src/testApp.cpp">
+ <Option virtualFolder="src/" />
</Unit>
- <Unit filename="../../openFrameworks/addons/ofxXmlSettings/libs/tinyxml.h">
- <Option virtualFolder="addons/ofxXmlSettings/libs" />
+ <Unit filename="src/testApp.h">
+ <Option virtualFolder="src/" />
</Unit>
- <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxTCPServer.h">
+ <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxNetwork.h">
<Option virtualFolder="addons/ofxNetwork/src" />
</Unit>
- <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxTCPManager.cpp">
+ <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxNetworkUtils.h">
<Option virtualFolder="addons/ofxNetwork/src" />
</Unit>
<Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxTCPClient.cpp">
<Option virtualFolder="addons/ofxNetwork/src" />
</Unit>
- <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxNetworkUtils.h">
+ <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxTCPClient.h">
<Option virtualFolder="addons/ofxNetwork/src" />
</Unit>
- <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxTCPManager.h">
+ <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxTCPManager.cpp">
<Option virtualFolder="addons/ofxNetwork/src" />
</Unit>
- <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxTCPClient.h">
+ <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxTCPManager.h">
<Option virtualFolder="addons/ofxNetwork/src" />
</Unit>
<Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxTCPServer.cpp">
<Option virtualFolder="addons/ofxNetwork/src" />
</Unit>
- <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxUDPManager.h">
+ <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxTCPServer.h">
<Option virtualFolder="addons/ofxNetwork/src" />
</Unit>
<Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxUDPManager.cpp">
<Option virtualFolder="addons/ofxNetwork/src" />
</Unit>
- <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxNetwork.h">
+ <Unit filename="../../openFrameworks/addons/ofxNetwork/src/ofxUDPManager.h">
<Option virtualFolder="addons/ofxNetwork/src" />
</Unit>
+ <Unit filename="../../openFrameworks/addons/ofxXmlSettings/libs/tinyxml.cpp">
+ <Option virtualFolder="addons/ofxXmlSettings/libs" />
+ </Unit>
+ <Unit filename="../../openFrameworks/addons/ofxXmlSettings/libs/tinyxml.h">
+ <Option virtualFolder="addons/ofxXmlSettings/libs" />
+ </Unit>
+ <Unit filename="../../openFrameworks/addons/ofxXmlSettings/libs/tinyxmlerror.cpp">
+ <Option virtualFolder="addons/ofxXmlSettings/libs" />
+ </Unit>
+ <Unit filename="../../openFrameworks/addons/ofxXmlSettings/libs/tinyxmlparser.cpp">
+ <Option virtualFolder="addons/ofxXmlSettings/libs" />
+ </Unit>
+ <Unit filename="../../openFrameworks/addons/ofxXmlSettings/src/ofxXmlSettings.cpp">
+ <Option virtualFolder="addons/ofxXmlSettings/src" />
+ </Unit>
+ <Unit filename="../../openFrameworks/addons/ofxXmlSettings/src/ofxXmlSettings.h">
+ <Option virtualFolder="addons/ofxXmlSettings/src" />
+ </Unit>
+ <Extensions>
+ <code_completion />
+ <envvars />
+ <debugger />
+ </Extensions>
</Project>
</CodeBlocks_project_file>
diff --git a/vfg/vfg.layout b/vfg/vfg.layout
index 1053280..9b5ee28 100644
--- a/vfg/vfg.layout
+++ b/vfg/vfg.layout
@@ -1,4 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="yes" ?>
<CodeBlocks_layout_file>
<ActiveTarget name="Debug" />
+ <File name="src/music.cpp" open="1" top="0" tabpos="4">
+ <Cursor position="5044" topLine="88" />
+ </File>
+ <File name="src/music.h" open="1" top="0" tabpos="3">
+ <Cursor position="1817" topLine="20" />
+ </File>
+ <File name="src/testApp.cpp" open="1" top="1" tabpos="2">
+ <Cursor position="357" topLine="0" />
+ </File>
+ <File name="src/testApp.h" open="1" top="0" tabpos="1">
+ <Cursor position="576" topLine="0" />
+ </File>
</CodeBlocks_layout_file>