PHP Classes

File: xml2mid.php

Recommend this page to a friend!
  Classes of Fluxus   MIDI Class   xml2mid.php   Download  
File: xml2mid.php
Role: Example script
Content type: text/plain
Description: demonstrates MIDI XML to binary MIDI file conversion
Class: MIDI Class
Read, write and manipulate MIDI files and data
Author: By
Last change: improved
Date: 20 years ago
Size: 11,366 bytes
 

Contents

Class file image Download
<?php $p=$_POST;$g=$_GET; //'cause I'm lazy /**************************************************************************** TMP FILE HANDLING ****************************************************************************/ session_start(); $save_dir = 'tmp/sess_'.session_id().'/'; //clean up, remove files belonging to expired session $sessions = array(); $handle = opendir (session_save_path()); while (false !== ($file = readdir ($handle))) if ($file!='.' && $file!='..') $sessions[] = $file; closedir($handle); $handle = opendir('tmp/'); while (false !== ($dir = readdir ($handle))) if (is_dir($dir) && $dir!='.' && $dir!='..' && !in_array($dir,$sessions)) rm("tmp/$dir/"); closedir($handle); // removes non-empty dir function rm($dir){ $handle = opendir($dir); while (false !== ($file = readdir ($handle))) if ($file!='.' && $file!='..') unlink("$dir/$file"); closedir($handle); rmdir($dir); } if (!is_dir('tmp')) mkdir('tmp'); if (!is_dir($save_dir)) mkdir($save_dir); srand((double)microtime()*1000000); $file = $save_dir.rand().'.mid'; /**************************************************************************** MIDI CLASS ****************************************************************************/ require('midi.class.php'); if (isset($g['download'])){ $file = $g['download']; $filename = 'output.mid'; $midi = new Midi(); $midi->downloadMidFile($file,$filename); } $engine = isset($p['engine'])?$p['engine']:'wm'; $test='<?xml version="1.0" encoding="ISO-8859-1"?> <!DOCTYPE MIDIFile SYSTEM "http://www.musicxml.org/dtds/midixml.dtd"> <MIDIFile> <Format>1</Format> <TrackCount>2</TrackCount> <TicksPerBeat>120</TicksPerBeat> <TimestampType>Absolute</TimestampType> <Track Number="0"> <Event> <Absolute>0</Absolute> <TimeSignature Numerator="4" LogDenominator="2" MIDIClocksPerMetronomeClick="24" ThirtySecondsPer24Clocks="8"/> </Event> <Event> <Absolute>0</Absolute> <KeySignature Fifths="0" Mode="0"/> </Event> <Event> <Absolute>0</Absolute> <SetTempo Value="371520"/> </Event> <Event> <Absolute>0</Absolute> <EndOfTrack/> </Event> </Track> <Track Number="1"> <Event> <Absolute>0</Absolute> <ProgramChange Channel="1" Number="73"/> </Event> <Event> <Absolute>0</Absolute> <NoteOn Channel="1" Note="43" Velocity="127"/> </Event> <Event> <Absolute>240</Absolute> <NoteOn Channel="1" Note="59" Velocity="100"/> </Event> <Event> <Absolute>240</Absolute> <NoteOn Channel="1" Note="66" Velocity="100"/> </Event> <Event> <Absolute>256</Absolute> <NoteOn Channel="1" Note="62" Velocity="100"/> </Event> <Event> <Absolute>376</Absolute> <NoteOn Channel="1" Note="66" Velocity="0"/> </Event> <Event> <Absolute>392</Absolute> <NoteOn Channel="1" Note="55" Velocity="100"/> </Event> <Event> <Absolute>422</Absolute> <NoteOn Channel="1" Note="43" Velocity="0"/> </Event> <Event> <Absolute>632</Absolute> <NoteOn Channel="1" Note="59" Velocity="0"/> </Event> <Event> <Absolute>738</Absolute> <NoteOn Channel="1" Note="50" Velocity="100"/> </Event> <Event> <Absolute>738</Absolute> <NoteOn Channel="1" Note="57" Velocity="100"/> </Event> <Event> <Absolute>738</Absolute> <NoteOn Channel="1" Note="62" Velocity="0"/> </Event> <Event> <Absolute>738</Absolute> <NoteOn Channel="1" Note="66" Velocity="100"/> </Event> <Event> <Absolute>798</Absolute> <NoteOn Channel="1" Note="38" Velocity="100"/> </Event> <Event> <Absolute>798</Absolute> <NoteOn Channel="1" Note="57" Velocity="0"/> </Event> <Event> <Absolute>798</Absolute> <NoteOn Channel="1" Note="66" Velocity="0"/> </Event> <Event> <Absolute>814</Absolute> <NoteOn Channel="1" Note="50" Velocity="0"/> </Event> <Event> <Absolute>844</Absolute> <NoteOn Channel="1" Note="55" Velocity="0"/> </Event> <Event> <Absolute>860</Absolute> <NoteOn Channel="1" Note="57" Velocity="100"/> </Event> <Event> <Absolute>860</Absolute> <NoteOn Channel="1" Note="66" Velocity="100"/> </Event> <Event> <Absolute>890</Absolute> <NoteOn Channel="1" Note="37" Velocity="100"/> </Event> <Event> <Absolute>966</Absolute> <NoteOn Channel="1" Note="61" Velocity="100"/> </Event> <Event> <Absolute>1072</Absolute> <NoteOn Channel="1" Note="66" Velocity="0"/> </Event> <Event> <Absolute>1162</Absolute> <NoteOn Channel="1" Note="37" Velocity="0"/> </Event> <Event> <Absolute>1162</Absolute> <NoteOn Channel="1" Note="38" Velocity="0"/> </Event> <Event> <Absolute>1178</Absolute> <NoteOn Channel="1" Note="61" Velocity="0"/> </Event> <Event> <Absolute>1268</Absolute> <NoteOn Channel="1" Note="50" Velocity="100"/> </Event> <Event> <Absolute>1268</Absolute> <NoteOn Channel="1" Note="66" Velocity="100"/> </Event> <Event> <Absolute>1298</Absolute> <NoteOn Channel="1" Note="50" Velocity="0"/> </Event> <Event> <Absolute>1404</Absolute> <NoteOn Channel="1" Note="66" Velocity="0"/> </Event> <Event> <Absolute>1464</Absolute> <NoteOn Channel="1" Note="66" Velocity="100"/> </Event> <Event> <Absolute>1510</Absolute> <NoteOn Channel="1" Note="66" Velocity="0"/> </Event> <Event> <Absolute>1540</Absolute> <NoteOn Channel="1" Note="43" Velocity="100"/> </Event> <Event> <Absolute>1736</Absolute> <NoteOn Channel="1" Note="55" Velocity="100"/> </Event> <Event> <Absolute>1766</Absolute> <NoteOn Channel="1" Note="59" Velocity="100"/> </Event> <Event> <Absolute>1766</Absolute> <NoteOn Channel="1" Note="62" Velocity="100"/> </Event> <Event> <Absolute>1766</Absolute> <NoteOn Channel="1" Note="66" Velocity="100"/> </Event> <Event> <Absolute>1856</Absolute> <NoteOn Channel="1" Note="66" Velocity="0"/> </Event> <Event> <Absolute>1886</Absolute> <NoteOn Channel="1" Note="71" Velocity="100"/> </Event> <Event> <Absolute>1902</Absolute> <NoteOn Channel="1" Note="43" Velocity="0"/> </Event> <Event> <Absolute>1932</Absolute> <NoteOn Channel="1" Note="71" Velocity="0"/> </Event> <Event> <Absolute>1992</Absolute> <NoteOn Channel="1" Note="59" Velocity="0"/> </Event> <Event> <Absolute>2022</Absolute> <NoteOn Channel="1" Note="71" Velocity="100"/> </Event> <Event> <Absolute>2112</Absolute> <NoteOn Channel="1" Note="71" Velocity="0"/> </Event> <Event> <Absolute>2188</Absolute> <NoteOn Channel="1" Note="57" Velocity="0"/> </Event> <Event> <Absolute>2188</Absolute> <NoteOn Channel="1" Note="71" Velocity="100"/> </Event> <Event> <Absolute>2264</Absolute> <NoteOn Channel="1" Note="62" Velocity="0"/> </Event> <Event> <Absolute>2294</Absolute> <NoteOn Channel="1" Note="71" Velocity="0"/> </Event> <Event> <Absolute>2310</Absolute> <NoteOn Channel="1" Note="62" Velocity="100"/> </Event> <Event> <Absolute>2356</Absolute> <NoteOn Channel="1" Note="50" Velocity="100"/> </Event> <Event> <Absolute>2356</Absolute> <NoteOn Channel="1" Note="57" Velocity="100"/> </Event> <Event> <Absolute>2356</Absolute> <NoteOn Channel="1" Note="62" Velocity="0"/> </Event> <Event> <Absolute>2356</Absolute> <NoteOn Channel="1" Note="66" Velocity="100"/> </Event> <Event> <Absolute>2372</Absolute> <NoteOn Channel="1" Note="37" Velocity="100"/> </Event> <Event> <Absolute>2372</Absolute> <NoteOn Channel="1" Note="50" Velocity="0"/> </Event> <Event> <Absolute>2448</Absolute> <NoteOn Channel="1" Note="38" Velocity="100"/> </Event> <Event> <Absolute>2448</Absolute> <NoteOn Channel="1" Note="55" Velocity="0"/> </Event> <Event> <Absolute>2448</Absolute> <NoteOn Channel="1" Note="66" Velocity="0"/> </Event> <Event> <Absolute>2464</Absolute> <NoteOn Channel="1" Note="57" Velocity="0"/> </Event> <Event> <Absolute>2510</Absolute> <NoteOn Channel="1" Note="57" Velocity="100"/> </Event> <Event> <Absolute>2510</Absolute> <NoteOn Channel="1" Note="66" Velocity="100"/> </Event> <Event> <Absolute>2540</Absolute> <NoteOn Channel="1" Note="69" Velocity="100"/> </Event> <Event> <Absolute>2570</Absolute> <NoteOn Channel="1" Note="69" Velocity="0"/> </Event> <Event> <Absolute>2660</Absolute> <NoteOn Channel="1" Note="61" Velocity="100"/> </Event> <Event> <Absolute>2706</Absolute> <NoteOn Channel="1" Note="66" Velocity="0"/> </Event> <Event> <Absolute>2766</Absolute> <NoteOn Channel="1" Note="37" Velocity="0"/> </Event> <Event> <Absolute>2782</Absolute> <NoteOn Channel="1" Note="38" Velocity="0"/> </Event> <Event> <Absolute>2798</Absolute> <NoteOn Channel="1" Note="61" Velocity="0"/> </Event> <Event> <Absolute>2904</Absolute> <NoteOn Channel="1" Note="50" Velocity="100"/> </Event> <Event> <Absolute>2964</Absolute> <NoteOn Channel="1" Note="50" Velocity="0"/> </Event> <Event> <Absolute>3100</Absolute> <NoteOn Channel="1" Note="57" Velocity="0"/> </Event> <Event> <Absolute>3100</Absolute> <EndOfTrack/> </Event> </Track> </MIDIFile>'; if (isset($p['txt'])){ $txt = $p['txt']; if (get_magic_quotes_gpc()==1) $txt = stripslashes($txt); }else $txt = $test; ?> <html> <head> <meta http-equiv="content-type" content="text/html; charset=iso-8859-1" /> <title>Xml2Midi</title> <style> body {font-family:arial;font-size:11px;margin:5px;} form {font-family:arial;font-size:11px;} td {font-family:arial;font-size:11px} input {font-family:arial;font-size:11px} textarea {font-family:"courier new",courier;font-size:11px} a,a:link,a:visited,a:active {font-family:arial;font-size:11px;color:#000000;} a:hover {font-family:font-family:arial;font-size:11px;color:#666666;} </style> </head> <body style="margin:5px;font-family:Courier"> <form action="xml2mid.php" method="POST"> <textarea name="txt" cols=60 rows=30><?php echo $txt?></textarea> <br> <input type="radio" name="engine" value="bk"<?php echo $engine=='bk'?' checked':''?>>Beatnik <input type="radio" name="engine" value="qt"<?php echo $engine=='qt'?' checked':''?>>QuickTime <input type="radio" name="engine" value="wm"<?php echo $engine=='wm'?' checked':''?>>Windows Media <input type="radio" name="engine" value=""<?php echo $engine==''?' checked':''?>>other (default Player)<br><br> <input type="submit" value=" send "> </form> <?php if (isset($p['txt'])){ $midi = new Midi(); $midi->importXml($txt); $midi->saveMidFile($file); $midi->playMidFile($file,1,1,0,$engine); ?> <br><br><input type="button" name="download" value="Save as SMF (*.mid)" onClick="self.location.href='sequencer.php?download=<?php echo urlencode($file)?>'"> <?php } ?> </body> </html>