summaryrefslogtreecommitdiff
path: root/doxygen/html/playsmf_8cpp-source.html
blob: 5db53c42148c7bfff4da394b19c7ed2d19a423a9 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
<HTML>
<HEAD>
<TITLE>The Synthesis ToolKit in C++ (STK)</TITLE>
<LINK HREF="doxygen.css" REL="stylesheet" TYPE="text/css">
</HEAD>
<BODY BGCOLOR="#FFFFFF">
<CENTER>
<img src="princeton.gif"> &nbsp; <img src="ccrma.gif"><P>
<a class="qindex" href="index.html">Home</a> &nbsp; <a class="qindex" href="information.html">Information</a> &nbsp; <a class="qindex" href="classes.html">Classes</a> &nbsp; <a class="qindex" href="download.html">Download</a> &nbsp; <a class="qindex" href="usage.html">Usage</a> &nbsp; <a class="qindex" href="maillist.html">Mail List</a> &nbsp; <a class="qindex" href="system.html">Requirements</a> &nbsp; <a class="qindex" href="links.html">Links</a> &nbsp; <a class="qindex" href="tutorial.html">Tutorial</a></CENTER>
<HR>
<!-- Generated by Doxygen 1.3-rc3 -->
<h1>playsmf.cpp</h1><div class="fragment"><pre>00001 <span class="comment">// playsmf.cpp</span>
00002 <span class="comment">//</span>
00003 <span class="comment">// Simple program to test the MidiFileIn class by reading and playing</span>
00004 <span class="comment">// a single track from a given Standard MIDI file.</span>
00005 <span class="comment">//</span>
00006 <span class="comment">// by Gary Scavone, 2003.</span>
00007 <span class="comment">//</span>
00008 <span class="comment">// compile: g++ -Wall -o playsmf playsmf.cpp RtMidi.o MidiFileIn.cpp Stk.cpp -framework CoreMIDI -framework CoreFoundation -framework CoreAudio</span>
00009 
00010 <span class="preprocessor">#include "MidiFileIn.h"</span>
00011 <span class="preprocessor">#include "RtMidi.h"</span>
00012 <span class="preprocessor">#include &lt;signal.h&gt;</span>
00013 <span class="preprocessor">#include &lt;unistd.h&gt;</span>
00014 
00015 <span class="keywordtype">bool</span> done = <span class="keyword">false</span>;
00016 <span class="keyword">static</span> <span class="keywordtype">void</span> finish(<span class="keywordtype">int</span> ignore){ done = <span class="keyword">true</span>; }
00017 
00018 <span class="keywordtype">void</span> usage(<span class="keywordtype">void</span>) {
00019   <span class="comment">// Error function in case of incorrect command-line</span>
00020   <span class="comment">// argument specifications.</span>
00021   std::cout &lt;&lt; <span class="stringliteral">"\nusage: testmidi file track\n"</span>;
00022   std::cout &lt;&lt; <span class="stringliteral">"   where file = a standard MIDI file,\n"</span>;
00023   std::cout &lt;&lt; <span class="stringliteral">"   and track = the track to play (0 = 1st track).\n\n"</span>;
00024   exit(0);
00025 }
00026 
00027 <span class="keywordtype">int</span> main( <span class="keywordtype">int</span> argc, <span class="keywordtype">char</span> *argv[] )
00028 {
00029   <span class="keywordflow">if</span> ( argc != 3 ) usage();
00030 
00031   <a class="code" href="classRtMidiOut.html">RtMidiOut</a> midi;
00032 
00033   <span class="keywordflow">if</span> ( midi.<a class="code" href="classRtMidiOut.html#a5">getPortCount</a>() &lt; 1 ) {
00034     std::cout &lt;&lt; <span class="stringliteral">"\nThere are no MIDI output destinations available!\n\n"</span>;
00035     exit(0);
00036   }
00037 
00038   <span class="keywordflow">try</span> {
00039     midi.<a class="code" href="classRtMidiOut.html#a3">openPort</a>();
00040   }
00041   <span class="keywordflow">catch</span> ( <a class="code" href="classRtError.html">RtError</a> &amp; ) {
00042     <span class="comment">// You might want to do something more useful here.</span>
00043     std::cout &lt;&lt; <span class="stringliteral">"\nAborting program!\n"</span>;
00044     exit(0);
00045   }
00046 
00047   <span class="comment">// Install an interrupt handler function.  Type "ctrl-c" to quit the</span>
00048   <span class="comment">// program.</span>
00049   (void) signal(SIGINT, finish);
00050   
00051   <span class="keywordflow">try</span> {
00052     <a class="code" href="classMidiFileIn.html">MidiFileIn</a> midiFile( argv[1] );
00053 
00054     <span class="comment">// Print a little information about the file.</span>
00055     std::cout &lt;&lt; <span class="stringliteral">"\nThe MIDI file ("</span> &lt;&lt; argv[1] &lt;&lt; <span class="stringliteral">") information:\n"</span>;
00056     std::cout &lt;&lt; <span class="stringliteral">"  - format = "</span> &lt;&lt; midiFile.<a class="code" href="classMidiFileIn.html#a2">getFileFormat</a>() &lt;&lt; <span class="stringliteral">"\n"</span>;
00057     std::cout &lt;&lt; <span class="stringliteral">"  - tracks = "</span> &lt;&lt; midiFile.<a class="code" href="classMidiFileIn.html#a3">getNumberOfTracks</a>() &lt;&lt; <span class="stringliteral">"\n"</span>;
00058     std::cout &lt;&lt; <span class="stringliteral">"  - seconds / ticks = "</span> &lt;&lt; midiFile.<a class="code" href="classMidiFileIn.html#a6">getTickSeconds</a>() &lt;&lt; <span class="stringliteral">"\n"</span>;
00059 
00060     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> track = (<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span>) atoi( argv[2] );
00061     <span class="keywordflow">if</span> ( midiFile.<a class="code" href="classMidiFileIn.html#a3">getNumberOfTracks</a>() &lt;= track ) {
00062       std::cout &lt;&lt; <span class="stringliteral">"\nInvalid track number ... playing track 0.\n"</span>;
00063       track = 0;
00064     }
00065 
00066     std::cout &lt;&lt; <span class="stringliteral">"\nPress &lt;enter&gt; to start reading/playing.\n"</span>;
00067     <span class="keywordtype">char</span> input;
00068     std::cin.get(input);
00069     
00070     std::vector&lt;unsigned char&gt; event;
00071     <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span> ticks = midiFile.<a class="code" href="classMidiFileIn.html#a8">getNextMidiEvent</a>( &amp;event, track );
00072     <span class="keywordflow">while</span> ( !done &amp;&amp; event.size() ) {
00073 
00074       <span class="comment">// Pause for the MIDI event delta time.</span>
00075       <a class="code" href="classStk.html#d7">Stk::sleep</a>( (<span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>) (ticks * midiFile.<a class="code" href="classMidiFileIn.html#a6">getTickSeconds</a>() * 1000 ) );
00076 
00077       midi.<a class="code" href="classRtMidiOut.html#a7">sendMessage</a>( &amp;event );
00078 
00079       <span class="comment">// Get a new event.</span>
00080       ticks = midiFile.<a class="code" href="classMidiFileIn.html#a8">getNextMidiEvent</a>( &amp;event, track );
00081     }
00082 
00083     <span class="comment">// Send a "reset" to the synthesizer.</span>
00084     event.clear();
00085     event.push_back( 0xff );
00086     midi.<a class="code" href="classRtMidiOut.html#a7">sendMessage</a>( &amp;event );
00087   }
00088   <span class="keywordflow">catch</span> ( <a class="code" href="classStkError.html">StkError</a> &amp; ) {
00089     <span class="comment">// You might want to do something more useful here.</span>
00090     std::cout &lt;&lt; <span class="stringliteral">"\nAborting program!\n"</span>;
00091     midi.<a class="code" href="classRtMidiOut.html#a4">closePort</a>();
00092     exit(0);
00093   }
00094 
00095   std::cout &lt;&lt; <span class="stringliteral">"Goodbye!\n"</span>;
00096   <span class="keywordflow">return</span> 0;
00097 }
</pre></div><HR>

<table>
  <tr><td><A HREF="http://www-ccrma.stanford.edu/software/stk/"><I>The Synthesis ToolKit in C++ (STK)</I></A></td></tr>
  <tr><td>&copy;1995-2002 Perry R. Cook and Gary P. Scavone. All Rights Reserved.</td></tr>
</table>

</BODY>
</HTML>