diff options
| author | Tim Redfern <tim@gray.(none)> | 2012-11-02 17:19:17 +0000 |
|---|---|---|
| committer | Tim Redfern <tim@gray.(none)> | 2012-11-02 17:19:17 +0000 |
| commit | 2ea0f60bb2ca981ff1e72575dd92c4ab906fd1c7 (patch) | |
| tree | 559b3a70c0f378e30bc641e134304a77191dcc1b /vfg | |
| parent | a0eff6b1806e7a99edde8714fbb4f3330fc87a61 (diff) | |
syncing and drawing notes
Diffstat (limited to 'vfg')
| -rwxr-xr-x | vfg/bin/data/flake.png | bin | 0 -> 4570 bytes | |||
| -rwxr-xr-x | vfg/src/music.cpp | 109 | ||||
| -rwxr-xr-x | vfg/src/music.h | 37 | ||||
| -rwxr-xr-x | vfg/src/testApp.cpp | 11 | ||||
| -rwxr-xr-x | vfg/vfg.cbp | 76 | ||||
| -rw-r--r-- | vfg/vfg.layout | 12 |
6 files changed, 178 insertions, 67 deletions
diff --git a/vfg/bin/data/flake.png b/vfg/bin/data/flake.png Binary files differnew file mode 100755 index 0000000..b609837 --- /dev/null +++ b/vfg/bin/data/flake.png 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> |
