Halftone.php
author Dan Fuhry <dan@enanocms.org>
Sat, 15 Sep 2012 13:18:13 -0400
changeset 6 07ceb3e35e25
parent 5 c36fbf04faac
child 7 3a98ce7762a0
permissions -rw-r--r--
Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
     1
<?php
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
     2
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
     3
/**!info**
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
     4
{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
     5
  "Plugin Name"  : "Halftone",
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
     6
  "Plugin URI"   : "http://enanocms.org/plugin/halftone",
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
     7
  "Description"  : "Allows semantic input and transposition of chord sheets.",
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
     8
  "Author"       : "Dan Fuhry",
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
     9
  "Version"      : "0.1",
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    10
  "Author URI"   : "http://enanocms.org/",
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    11
  "Version list" : ['0.1']
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    12
}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    13
**!*/
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    14
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    15
$plugins->attachHook('render_wikiformat_posttemplates', 'halftone_process_tags($text);');
3
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
    16
$plugins->attachHook('html_attribute_whitelist', '$whitelist["halftone"] = array("title", "transpose");');
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    17
$plugins->attachHook('session_started', 'register_special_page(\'HalftoneRender\', \'Halftone AJAX render handler\', false);');
6
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
    18
$plugins->attachHook('render_getpage_norender', 'halftone_set_keys_from_tpl_vars($text);');
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    19
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    20
define('KEY_C', 0);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    21
define('KEY_D', 2);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    22
define('KEY_E', 4);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    23
define('KEY_F', 5);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    24
define('KEY_G', 7);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    25
define('KEY_A', 9);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    26
define('KEY_B', 11);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    27
define('KEY_C_SHARP', 1);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    28
define('KEY_E_FLAT', 3);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    29
define('KEY_F_SHARP', 6);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    30
define('KEY_G_SHARP', 8);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    31
define('KEY_B_FLAT', 10);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    32
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    33
define('ACC_FLAT', -1);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    34
define('ACC_SHARP', 1);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    35
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    36
$circle_of_fifths = array(KEY_C, KEY_G, KEY_D, KEY_A, KEY_E, KEY_B, KEY_F_SHARP, KEY_C_SHARP, KEY_G_SHARP, KEY_E_FLAT, KEY_B_FLAT, KEY_F);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    37
$accidentals = array(
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    38
	KEY_C => ACC_FLAT,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    39
	KEY_G => ACC_SHARP,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    40
	KEY_D => ACC_SHARP,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    41
	KEY_A => ACC_SHARP,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    42
	KEY_E => ACC_SHARP,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    43
	KEY_B => ACC_SHARP,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    44
	KEY_F_SHARP => ACC_SHARP,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    45
	KEY_C_SHARP => ACC_SHARP,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    46
	KEY_G_SHARP => ACC_FLAT,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    47
	KEY_E_FLAT => ACC_FLAT,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    48
	KEY_B_FLAT => ACC_FLAT,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    49
	KEY_F => ACC_FLAT
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    50
);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    51
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    52
function get_consonants($root_key)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    53
{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    54
	global $circle_of_fifths;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    55
	$first = $root_key;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    56
	$key = array_search($root_key, $circle_of_fifths);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    57
	$fourth = $circle_of_fifths[(($key - 1) + count($circle_of_fifths)) % count($circle_of_fifths)];
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    58
	$fifth = $circle_of_fifths[($key + 1) % count($circle_of_fifths)];
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    59
	
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    60
	$minor1 = $circle_of_fifths[($key + 2) % count($circle_of_fifths)];
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    61
	$minor2 = $circle_of_fifths[($key + 3) % count($circle_of_fifths)];
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    62
	$minor3 = $circle_of_fifths[($key + 4) % count($circle_of_fifths)];
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    63
	
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    64
	$result = array(
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    65
			'first' => $first,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    66
			'fourth' => $fourth,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    67
			'fifth' => $fifth,
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    68
			'minors' => array($minor1, $minor2, $minor3)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    69
		);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    70
	return $result;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    71
}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    72
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    73
function get_sharp($chord)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    74
{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    75
	return key_to_name(name_to_key($chord), ACC_SHARP);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    76
}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    77
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    78
function detect_key($chord_list)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    79
{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    80
	$majors = array();
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    81
	$minors = array();
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    82
	$sharp_or_flat = ACC_SHARP;
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
    83
	// sus4 chords are also a great indicator since they are almost always
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
    84
	// used exclusively on the fifth
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
    85
	$have_sus4 = false;
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    86
	// index which chords are used in the song
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    87
	foreach ( $chord_list as $chord )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    88
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    89
		// discard bass note
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    90
		list($chord) = explode('/', $chord);
5
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
    91
		// skip chord if it has a "!"
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
    92
		if ( $chord{0} == '!' )
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
    93
		{
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
    94
			continue;
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
    95
		}
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
    96
		
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    97
		$match = array();
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
    98
		preg_match('/((?:[Mm]?7?|2|5|6|add9|sus4|[Mm]aj[79]|dim|aug)?)$/', $chord, $match);
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
    99
		if ( !empty($match[1]) )
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   100
		{
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   101
			$chord = str_replace_once($match[1], '', $chord);
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   102
			if ( $match[1] === 'sus4' )
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   103
				$have_sus4 = $chord;
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   104
		}
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   105
		$sharp_or_flat = get_sharp($chord) == $chord ? ACC_SHARP : ACC_FLAT;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   106
		$chord = get_sharp($chord);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   107
		if ( $match[1] == 'm' || $match[1] == 'm7' )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   108
		{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   109
			// minor chord
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   110
			if ( !isset($minors[$chord]) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   111
				$minors[$chord] = 0;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   112
			$minors[$chord]++;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   113
		}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   114
		else
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   115
		{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   116
			// major chord
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   117
			if ( !isset($majors[$chord]) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   118
				$majors[$chord] = 0;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   119
			$majors[$chord]++;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   120
		}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   121
	}
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   122
	/*
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   123
	// remove very low scorers
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   124
	foreach ( $majors as $key => $count )
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   125
	{
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   126
		if ( $count < 1 )
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   127
			unset($majors[$key]);
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   128
	}
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   129
	*/
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   130
	// now we go through each of the detected major chords, calculate its consonants, and determine how many of its consonants are present in the song.
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   131
	$scores = array();
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   132
	foreach ( $majors as $key => $count )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   133
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   134
		$scores[$key] = 0;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   135
		$consonants = get_consonants(name_to_key($key));
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   136
		if ( isset($majors[key_to_name($consonants['fourth'])]) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   137
			$scores[$key] += 2;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   138
		if ( isset($majors[key_to_name($consonants['fifth'])]) )
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   139
			$scores[$key] += $have_sus4 === key_to_name($consonants['fifth']) ? 4 : 2;
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   140
		if ( isset($majors[key_to_name($consonants['minors'][0])]) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   141
			$scores[$key] += 1;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   142
		if ( isset($majors[key_to_name($consonants['minors'][1])]) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   143
			$scores[$key] += 2;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   144
		if ( isset($majors[key_to_name($consonants['minors'][2])]) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   145
			$scores[$key] += 1;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   146
	}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   147
	$winner_val = -1;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   148
	$winner_key = '';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   149
	foreach ( $scores as $key => $score )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   150
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   151
		if ( $score > $winner_val )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   152
		{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   153
			$winner_val = $score;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   154
			$winner_key = $key;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   155
		}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   156
	}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   157
	$winner_key = key_to_name(name_to_key($winner_key), $sharp_or_flat);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   158
	return $winner_key;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   159
}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   160
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   161
function key_to_name($root_key, $accidental = ACC_SHARP)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   162
{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   163
	switch($root_key)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   164
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   165
		case KEY_C:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   166
			return 'C';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   167
		case KEY_D:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   168
			return 'D';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   169
		case KEY_E:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   170
			return 'E';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   171
		case KEY_F:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   172
			return 'F';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   173
		case KEY_G:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   174
			return 'G';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   175
		case KEY_A:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   176
			return 'A';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   177
		case KEY_B:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   178
			return 'B';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   179
		case KEY_C_SHARP:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   180
			return $accidental == ACC_FLAT ? 'Db' : 'C#';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   181
		case KEY_E_FLAT:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   182
			return $accidental == ACC_FLAT ? 'Eb' : 'D#';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   183
		case KEY_F_SHARP:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   184
			return $accidental == ACC_FLAT ? 'Gb' : 'F#';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   185
		case KEY_G_SHARP:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   186
			return $accidental == ACC_FLAT ? 'Ab' : 'G#';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   187
		case KEY_B_FLAT:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   188
			return $accidental == ACC_FLAT ? 'Bb' : 'A#';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   189
		default:
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   190
			return false;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   191
	}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   192
}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   193
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   194
function name_to_key($name)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   195
{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   196
	switch($name)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   197
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   198
		case 'C': return KEY_C;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   199
		case 'D': return KEY_D;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   200
		case 'E': return KEY_E;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   201
		case 'F': return KEY_F;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   202
		case 'G': return KEY_G;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   203
		case 'A': return KEY_A;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   204
		case 'B': return KEY_B;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   205
		case 'C#': case 'Db': return KEY_C_SHARP;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   206
		case 'D#': case 'Eb': return KEY_E_FLAT;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   207
		case 'F#': case 'Gb': return KEY_F_SHARP;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   208
		case 'G#': case 'Ab': return KEY_G_SHARP;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   209
		case 'A#': case 'Bb': return KEY_B_FLAT;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   210
		default: return false;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   211
	}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   212
}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   213
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   214
function prettify_accidentals($chord)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   215
{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   216
	if ( count(explode('/', $chord)) > 1 )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   217
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   218
		list($upper, $lower) = explode('/', $chord);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   219
		return prettify_accidentals($upper) . '/' . prettify_accidentals($lower);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   220
	}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   221
	
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   222
	if ( strlen($chord) < 2 )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   223
		return $chord;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   224
	
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   225
	if ( $chord{1} == 'b' )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   226
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   227
		$chord = $chord{0} . '&flat;' . substr($chord, 2);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   228
	}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   229
	else if ( $chord{1} == '#' )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   230
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   231
		$chord = $chord{0} . '&sharp;' . substr($chord, 2);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   232
	}
5
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
   233
	return ltrim($chord, '!');
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   234
}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   235
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   236
function transpose_chord($chord, $increment, $accidental = false)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   237
{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   238
	global $circle_of_fifths;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   239
	
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   240
	if ( count(explode('/', $chord)) > 1 )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   241
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   242
		list($upper, $lower) = explode('/', $chord);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   243
		return transpose_chord($upper, $increment, $accidental) . '/' . transpose_chord($lower, $increment, $accidental);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   244
	}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   245
	// shave off any wacky things we're doing to the chord (minor, seventh, etc.)
5
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
   246
	$prechord = '';
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
   247
	if ( $chord{0} == '!' )
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
   248
	{
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
   249
		$prechord = '!';
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
   250
		$chord = substr($chord, 1);
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
   251
	}
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   252
	preg_match('/((?:[Mm]?7?|2|5|6|add9|sus4|[Mm]aj[79]|dim|aug)?)$/', $chord, $match);
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   253
	// find base chord
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   254
	if ( !empty($match[1]) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   255
		$chord = str_replace($match[1], '', $chord);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   256
	// what's our accidental? allow it to be specified, and autodetect if it isn't
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   257
	if ( !$accidental )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   258
		$accidental = strstr($chord, '#') ? ACC_SHARP : ACC_FLAT;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   259
	// convert to numeric value
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   260
	$key = name_to_key($chord);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   261
	if ( $key === false )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   262
		// should never happen
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   263
		return "[TRANSPOSITION FAILED: " . $chord . $match[1] . "]";
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   264
	// transpose
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   265
	$key = (($key + $increment) + count($circle_of_fifths)) % count($circle_of_fifths);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   266
	// return result
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   267
	$kname = key_to_name($key, $accidental);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   268
	if ( !$kname )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   269
		// again, should never happen
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   270
		return "[TRANSPOSITION FAILED: " . $chord . $match[1] . " + $increment (-&gt;$key)]";
5
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
   271
	$result = $prechord . $kname . $match[1];
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   272
	// echo "$chord{$match[1]} + $increment = $result<br />";
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   273
	return $result;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   274
}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   275
6
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   276
function halftone_set_keys_from_tpl_vars(&$text)
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   277
{
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   278
	global $db, $session, $paths, $template, $plugins; // Common objects
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   279
	
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   280
	// did they specify a key?
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   281
	if ( !isset($template->tpl_strings['key']) )
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   282
	{
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   283
		return false;
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   284
	}
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   285
	
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   286
	// is the key valid?
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   287
	if ( !is_string(key_to_name($template->tpl_strings['key'])) )
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   288
	{
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   289
		return false;
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   290
	}
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   291
	
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   292
	if ( preg_match_all('/<halftone(.*?)>(.+?)<\/halftone>/s', $text, $matches) )
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   293
	{
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   294
		foreach ( $matches[0] as $i => $whole_match )
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   295
		{
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   296
			$attribs = decodeTagAttributes($matches[1][$i]);
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   297
			$attribs['transpose'] = $template->tpl_strings['key'];
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   298
			
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   299
			// re-encode tag attributes
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   300
			$attribs_encoded = '';
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   301
			foreach ( $attribs as $k => $v )
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   302
			{
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   303
				$attribs_encoded .= sprintf(" %s=\"%s\"", $k, htmlspecialchars($v));
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   304
			}
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   305
			
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   306
			$new_match = str_replace_once('<halftone', "<halftone{$attribs_encoded}", str_replace_once($matches[1][$i], '', $whole_match));
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   307
			$text = str_replace_once($whole_match, $new_match, $text);
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   308
		}
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   309
	}
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   310
}
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   311
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   312
function halftone_process_tags(&$text)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   313
{
3
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   314
	global $circle_of_fifths;
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   315
	
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   316
	static $css_added = false;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   317
	if ( !$css_added )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   318
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   319
		global $template;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   320
		$template->preload_js(array('jquery', 'jquery-ui'));
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   321
		$template->add_header('
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   322
			<style type="text/css">
1
87dfd1a261bd Several minor CSS changes to allow better integration with a theme designed for stage use and printing
Dan Fuhry <dan@enanocms.org>
parents: 0
diff changeset
   323
				div.halftone {
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   324
					page-break-before: always;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   325
				}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   326
				span.halftone-line {
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   327
					display: block;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   328
					padding-top: 10pt;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   329
					position: relative; /* allows the absolute positioning in chords to work */
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   330
				}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   331
				span.halftone-chord {
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   332
					position: absolute;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   333
					top: 0pt;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   334
					color: rgb(27, 104, 184);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   335
				}
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   336
				span.halftone-line.labeled span.halftone-chord {
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   337
					position: static;
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   338
				}
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   339
				span.halftone-chord.sequential {
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   340
					padding-left: 20pt;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   341
				}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   342
				div.halftone-key-select {
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   343
					float: right;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   344
				}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   345
			</style>
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   346
			<script type="text/javascript">
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   347
				addOnloadHook(function()
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   348
					{
2
2f3b76a405ce Fixed issue where js would break on pages with no halftone blocks
Dan Fuhry <dan@enanocms.org>
parents: 1
diff changeset
   349
						var first_ht = $("div.halftone").get(0);
2f3b76a405ce Fixed issue where js would break on pages with no halftone blocks
Dan Fuhry <dan@enanocms.org>
parents: 1
diff changeset
   350
						if ( first_ht )
2f3b76a405ce Fixed issue where js would break on pages with no halftone blocks
Dan Fuhry <dan@enanocms.org>
parents: 1
diff changeset
   351
							first_ht.style.pageBreakBefore = "auto";
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   352
						$("select.halftone-key").change(function()
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   353
							{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   354
								var me = this;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   355
								var src = $(this.parentNode.parentNode).attr("halftone:src");
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   356
								ajaxPost(makeUrlNS("Special", "HalftoneRender", "transpose=" + $(this).val()) + "&tokey=" + $("option:selected", this).attr("halftone:abs"), "src=" + encodeURIComponent(src), function(ajax)
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   357
									{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   358
										if ( ajax.readyState == 4 && ajax.status == 200 )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   359
										{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   360
											var $songbody = $("div.halftone-song", me.parentNode.parentNode);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   361
											$songbody.html(ajax.responseText);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   362
										}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   363
									});
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   364
							});
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   365
					});
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   366
			</script>
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   367
			');
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   368
		$css_added = true;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   369
	}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   370
	if ( preg_match_all('/<halftone(.*?)>(.+?)<\/halftone>/s', $text, $matches) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   371
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   372
		foreach ( $matches[0] as $i => $whole_match )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   373
		{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   374
			$attribs = decodeTagAttributes($matches[1][$i]);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   375
			$song_title = isset($attribs['title']) ? $attribs['title'] : 'Untitled song';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   376
			$chord_list = array();
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   377
			$inner = trim($matches[2][$i]);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   378
			$song = halftone_render_body($inner, $chord_list);
3
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   379
			
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   380
			$src = base64_encode($whole_match);
3
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   381
			$origkey = $key = name_to_key(detect_key($chord_list));
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   382
			if ( isset($attribs['transpose']) && is_int($tokey = name_to_key($attribs['transpose'])) )
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   383
			{
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   384
				// re-render in new key
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   385
				$transpose = $tokey - $key;
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   386
				$song = halftone_render_body($inner, $chord_list, $tokey, $transpose);
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   387
				$key = $tokey;
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   388
			}
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   389
			$select = '<select class="halftone-key">';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   390
			for ( $i = 0; $i < 12; $i++ )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   391
			{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   392
				$label = in_array($i, array(KEY_C_SHARP, KEY_E_FLAT, KEY_F_SHARP, KEY_G_SHARP, KEY_B_FLAT)) ? sprintf("%s/%s", key_to_name($i, ACC_SHARP), key_to_name($i, ACC_FLAT)) : key_to_name($i);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   393
				$label = prettify_accidentals($label);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   394
				$sel = $key == $i ? ' selected="selected"' : '';
3
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   395
				$select .= sprintf("<option%s value=\"%d\" halftone:abs=\"%d\">%s</option>", $sel, $i - $origkey, $i, $label);
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   396
			}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   397
			$select .= '</select>';
1
87dfd1a261bd Several minor CSS changes to allow better integration with a theme designed for stage use and printing
Dan Fuhry <dan@enanocms.org>
parents: 0
diff changeset
   398
			$headid = 'song:' . sanitize_page_id($song_title);
87dfd1a261bd Several minor CSS changes to allow better integration with a theme designed for stage use and printing
Dan Fuhry <dan@enanocms.org>
parents: 0
diff changeset
   399
			$text = str_replace_once($whole_match, "<div id=\"$headid\" class=\"halftone\" halftone:src=\"$src\"><div class=\"halftone-key-select\">$select</div><h1 class=\"halftone-title\">$song_title</h1>\n\n<div class=\"halftone-song\">\n" . $song . "</div></div>", $text);
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   400
		}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   401
	}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   402
}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   403
3
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   404
function halftone_render_body($inner, &$chord_list, $inkey = false, $transpose = 0)
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   405
{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   406
	global $accidentals;
1
87dfd1a261bd Several minor CSS changes to allow better integration with a theme designed for stage use and printing
Dan Fuhry <dan@enanocms.org>
parents: 0
diff changeset
   407
	$song = '<div class="section">';
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   408
	$chord_list = array();
3
c3150cee8dd9 Added support for the "transpose" tag which forces a song to be transposed.
Dan Fuhry <dan@enanocms.org>
parents: 2
diff changeset
   409
	$transpose = isset($_GET['transpose']) ? intval($_GET['transpose']) : $transpose;
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   410
	$transpose_accidental = $inkey ? $accidentals[$inkey] : false;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   411
	foreach ( explode("\n", $inner) as $line )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   412
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   413
		$chordline = false;
5
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
   414
		$chords_regex = '/(\((?:\!?[A-G][#b]?(?:[Mm]?7?|2|5|6|add9|sus4|[Mm]aj[79]|dim|aug)?(?:\/[A-G][#b]?)?)\))/';
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   415
		$line_split = preg_split($chords_regex, $line, -1, PREG_SPLIT_DELIM_CAPTURE);
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   416
		$line_pattern = '';
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   417
		if ( preg_match_all($chords_regex, $line, $chords) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   418
		{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   419
			// this is a line with lyrics + chords
5
c36fbf04faac Added "!" trick to give hints to the key detection algorithm. It's all Chris Tomlin's fault.
Dan Fuhry <dan@enanocms.org>
parents: 4
diff changeset
   420
			// echo out the line, adding spans around chords.
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   421
			$line_final = array();
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   422
			$last_was_chord = false;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   423
			foreach ( $line_split as $entry )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   424
			{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   425
				if ( preg_match($chords_regex, $entry) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   426
				{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   427
					if ( $last_was_chord )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   428
					{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   429
						while ( !($pop = array_pop($line_final)) );
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   430
						$new_entry = preg_replace('#</span>$#', '', $pop);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   431
						$new_entry .= str_repeat('&nbsp;', 4);
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   432
						$new_entry .= prettify_accidentals($chord_list[] = transpose_chord(trim($entry, '()'), $transpose, $transpose_accidental)) . '</span>';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   433
						$line_final[] = $new_entry;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   434
					}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   435
					else
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   436
					{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   437
						$line_final[] = '<span class="halftone-chord">' . prettify_accidentals($chord_list[] = transpose_chord(trim($entry, '()'), $transpose, $transpose_accidental)) . '</span>';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   438
					}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   439
					$last_was_chord = true;
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   440
					$line_pattern .= 'c';
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   441
				}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   442
				else
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   443
				{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   444
					if ( trim($entry) != "" )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   445
					{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   446
						$last_was_chord = false;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   447
						$line_final[] = $entry;
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   448
						$line_pattern .= 'w';
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   449
					}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   450
				}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   451
			}
4
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   452
			$class_append = preg_match('/^w?c+$/', $line_pattern) ? ' labeled' : '';
bb3789db954a Several bugfixes and improvements.
Dan Fuhry <dan@enanocms.org>
parents: 3
diff changeset
   453
			$song .= '<span class="halftone-line' . $class_append . '">' . implode("", $line_final) . "</span>\n";
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   454
		}
6
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   455
		else if ( preg_match('/^=\s*(.+?)\s*=\r?$/', $line, $match) )
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   456
		{
1
87dfd1a261bd Several minor CSS changes to allow better integration with a theme designed for stage use and printing
Dan Fuhry <dan@enanocms.org>
parents: 0
diff changeset
   457
			$song .= "</div>\n<div class=\"section\">\n== {$match[1]} ==\n\n";
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   458
		} 
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   459
		else if ( trim($line) == '' )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   460
		{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   461
			continue;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   462
		}
1
87dfd1a261bd Several minor CSS changes to allow better integration with a theme designed for stage use and printing
Dan Fuhry <dan@enanocms.org>
parents: 0
diff changeset
   463
		else if ( preg_match('/^\[(.+)\]$/', trim($line), $match) )
87dfd1a261bd Several minor CSS changes to allow better integration with a theme designed for stage use and printing
Dan Fuhry <dan@enanocms.org>
parents: 0
diff changeset
   464
		{
87dfd1a261bd Several minor CSS changes to allow better integration with a theme designed for stage use and printing
Dan Fuhry <dan@enanocms.org>
parents: 0
diff changeset
   465
			$song .= "<br /><strong>Jump to:</strong> {$match[1]}\n";
87dfd1a261bd Several minor CSS changes to allow better integration with a theme designed for stage use and printing
Dan Fuhry <dan@enanocms.org>
parents: 0
diff changeset
   466
		}
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   467
		else
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   468
		{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   469
			$song .= "$line<br />\n";
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   470
		}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   471
	}
6
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   472
	$song .= '</div>';
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   473
	
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   474
	//header('Content-type: text/plain');
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   475
	//die($song);
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   476
	
07ceb3e35e25 Added support for the render_getpage_norender hook, allowing transposition to take place via the "key" parameter when including Halftone pages as templates.
Dan Fuhry <dan@enanocms.org>
parents: 5
diff changeset
   477
	return $song;
0
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   478
}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   479
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   480
function page_Special_HalftoneRender()
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   481
{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   482
	global $accidentals;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   483
	$text = isset($_POST['src']) ? base64_decode($_POST['src']) : '';
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   484
	if ( preg_match('/<halftone(.*?)>(.+?)<\/halftone>/s', $text, $match) )
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   485
	{
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   486
		require_once(ENANO_ROOT . '/includes/wikiformat.php');
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   487
		$carp = new Carpenter();
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   488
		$carp->exclusive_rule('heading');
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   489
		$tokey = isset($_GET['tokey']) ? intval($_GET['tokey']) : false;
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   490
		echo $carp->render(halftone_render_body($match[2], $chord_list, $tokey));
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   491
	}
16db14829751 First commit.
Dan Fuhry <dan@enanocms.org>
parents:
diff changeset
   492
}