diff -r bb3789db954a -r c36fbf04faac Halftone.php --- a/Halftone.php Tue May 08 01:38:29 2012 -0400 +++ b/Halftone.php Sun Sep 02 23:48:00 2012 -0400 @@ -87,6 +87,12 @@ { // discard bass note list($chord) = explode('/', $chord); + // skip chord if it has a "!" + if ( $chord{0} == '!' ) + { + continue; + } + $match = array(); preg_match('/((?:[Mm]?7?|2|5|6|add9|sus4|[Mm]aj[79]|dim|aug)?)$/', $chord, $match); if ( !empty($match[1]) ) @@ -223,7 +229,7 @@ { $chord = $chord{0} . '♯' . substr($chord, 2); } - return $chord; + return ltrim($chord, '!'); } function transpose_chord($chord, $increment, $accidental = false) @@ -236,6 +242,12 @@ return transpose_chord($upper, $increment, $accidental) . '/' . transpose_chord($lower, $increment, $accidental); } // shave off any wacky things we're doing to the chord (minor, seventh, etc.) + $prechord = ''; + if ( $chord{0} == '!' ) + { + $prechord = '!'; + $chord = substr($chord, 1); + } preg_match('/((?:[Mm]?7?|2|5|6|add9|sus4|[Mm]aj[79]|dim|aug)?)$/', $chord, $match); // find base chord if ( !empty($match[1]) ) @@ -255,7 +267,7 @@ if ( !$kname ) // again, should never happen return "[TRANSPOSITION FAILED: " . $chord . $match[1] . " + $increment (->$key)]"; - $result = $kname . $match[1]; + $result = $prechord . $kname . $match[1]; // echo "$chord{$match[1]} + $increment = $result
"; return $result; } @@ -362,14 +374,13 @@ foreach ( explode("\n", $inner) as $line ) { $chordline = false; - $chords_regex = '/(\((?:[A-G][#b]?(?:[Mm]?7?|2|5|6|add9|sus4|[Mm]aj[79]|dim|aug)?(?:\/[A-G][#b]?)?)\))/'; + $chords_regex = '/(\((?:\!?[A-G][#b]?(?:[Mm]?7?|2|5|6|add9|sus4|[Mm]aj[79]|dim|aug)?(?:\/[A-G][#b]?)?)\))/'; $line_split = preg_split($chords_regex, $line, -1, PREG_SPLIT_DELIM_CAPTURE); $line_pattern = ''; if ( preg_match_all($chords_regex, $line, $chords) ) { // this is a line with lyrics + chords - // echo out the line, adding spans around chords. here is where we also do transposition - // (if requested) and + // echo out the line, adding spans around chords. $line_final = array(); $last_was_chord = false; foreach ( $line_split as $entry )