Advertisement
Guest User

Chord transposition

a guest
Oct 4th, 2010
169
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 2.21 KB | None | 0 0
  1.  
  2. <?php
  3. $s_OriginalSequence = <<< END_SEQ
  4. A
  5. Asus7
  6. Csus add9
  7. Dmaj7
  8. F#m7
  9. G#
  10. C#dim no3
  11. END_SEQ;
  12.  
  13. $s_TransposedUpSequence = <<< END_SEQ
  14. A#
  15. A#sus7
  16. C#sus add9
  17. D#maj7
  18. Gm7
  19. A
  20. Ddim no3
  21. END_SEQ;
  22.  
  23. $s_TransposedDownSequence = <<< END_SEQ
  24. G#
  25. G#sus7
  26. Bsus add9
  27. C#maj7
  28. Fm7
  29. G
  30. Cdim no3
  31. END_SEQ;
  32.  
  33. /**
  34.  * Transpose a chord sequence.
  35.  *
  36.  * @param $s_Sequence The chord sequence to transpose.
  37.  * @param $b_TransposeUp Transpose up or down.
  38.  *
  39.  * @return The transposed sequence.
  40.  */
  41. function transposeChord($s_Sequence, $b_TransposeUp = True) {
  42.     $a_Chords = array('A', 'A#', 'B', 'C', 'C#', 'D', 'D#', 'E', 'F', 'F#', 'G', 'G#');
  43.     return preg_replace_callback (
  44.         '`([A-G]#?)`',
  45.         function($a_Matches) use($a_Chords, $b_TransposeUp) {
  46.             // Find the position in the chords array of the found chord.
  47.             $a_ChordPositions = array_keys($a_Chords, $a_Matches[1], True);
  48.  
  49.             // Get the new chord position.
  50.             $i_NewChordPosition = (count($a_Chords) + $a_ChordPositions[0] + ($b_TransposeUp ? 1 : -1)) % count($a_Chords);
  51.  
  52.             // Return the new chord position.
  53.             return $a_Chords[$i_NewChordPosition];
  54.         },
  55.         $s_Sequence
  56.     );
  57. }
  58.  
  59. $s_TestTransposedUpSequence = transposeChord($s_OriginalSequence, True);
  60. $s_TestTransposedDownSequence = transposeChord($s_OriginalSequence, False);
  61.  
  62. echo 'Original Sequence', PHP_EOL, $s_OriginalSequence, PHP_EOL, PHP_EOL, PHP_EOL;
  63. echo 'Transposed Up', PHP_EOL, $s_TransposedUpSequence, PHP_EOL, PHP_EOL;
  64. echo 'vs', PHP_EOL, PHP_EOL, $s_TestTransposedUpSequence, PHP_EOL, PHP_EOL;
  65. echo (($s_TransposedUpSequence === $s_TestTransposedUpSequence) ? 'Match' : 'Fail'), PHP_EOL, PHP_EOL, PHP_EOL;
  66. echo 'Transposed Down', PHP_EOL, $s_TransposedDownSequence, PHP_EOL, PHP_EOL;
  67. echo 'vs', PHP_EOL, PHP_EOL, $s_TestTransposedDownSequence, PHP_EOL, PHP_EOL;
  68. echo (($s_TransposedDownSequence === $s_TestTransposedDownSequence) ? 'Match' : 'Fail');
  69. ?>
  70.  
  71. outputs ...
  72.  
  73. Original Sequence
  74. A
  75. Asus7
  76. Csus add9
  77. Dmaj7
  78. F#m7
  79. G#
  80. C#dim no3
  81.  
  82.  
  83. Transposed Up
  84. A#
  85. A#sus7
  86. C#sus add9
  87. D#maj7
  88. Gm7
  89. A
  90. Ddim no3
  91.  
  92. vs
  93.  
  94. A#
  95. A#sus7
  96. C#sus add9
  97. D#maj7
  98. Gm7
  99. A
  100. Ddim no3
  101.  
  102. Match
  103.  
  104.  
  105. Transposed Down
  106. G#
  107. G#sus7
  108. Bsus add9
  109. C#maj7
  110. Fm7
  111. G
  112. Cdim no3
  113.  
  114. vs
  115.  
  116. G#
  117. G#sus7
  118. Bsus add9
  119. C#maj7
  120. Fm7
  121. G
  122. Cdim no3
  123.  
  124. Match
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement