This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
header('Content-Type: application/json'); | |
$pattern = empty($_GET[pattern]) ? "2122122" : $_GET[pattern]; | |
// transpose: positive(+) only and must be within 11 | |
$transpose = empty($_GET[transpose]) ? 0 : $_GET[transpose]; | |
$str_arr = str_split($pattern); | |
$names_common = array("", "C", "C+", "D", "E-", "E", "F", "F+", "G", "A-", "A", "B-", "B"); | |
$names_sharp = array("", "C", "C+", "D", "D+", "E", "F", "F+", "G", "G+", "A", "A+", "B"); | |
$sum = 1; | |
$output_arr = []; | |
$output_num = []; | |
$output_json = []; | |
// show first note | |
array_push($output_arr, $names_common[$sum + $transpose]); | |
foreach($str_arr as $e){ | |
$sum += $e; | |
$disp_num = $transpose + $sum; | |
if($disp_num > 12){ | |
array_push($output_arr, $names_common[$disp_num – 12]); | |
} else { | |
array_push($output_arr, $names_common[$disp_num]); | |
} | |
array_push($output_num, $disp_num); | |
} | |
$output_json = array("notesByName" => $output_arr, "notesBySemitone" => $output_num, | |
"root" => $names_common[$transpose + 1] , | |
"name" => "example name", "pattern" => $pattern); | |
echo json_encode($output_json); | |
?> |
이 예제는 개인 작업중인 내용을 주요 부분만 추출한 것으로, 패턴(pattern)이라는 파라미터를 입력하면 루트 음을 고려한 스케일을 계산하여 json으로 뿌려주는 php 예제입니다.
파라미터는 pattern
, transpose
두 개가 있습니다. 여기서 패턴은 스케일의 각 두 음 사이간의 반음 간격을 semitone이라는 단위로 표시한 것을 일렬로 나열한 것입니다. 예를 들어 C와 D의 반음 간격은 2이며, D와 Eb의 반음 간격은 1, 다음 Eb와 F 사이의 간격은 2… 이런 식으로 끝까지 계산해서 나열한 것이 위의 Pattern입니다.
근음(root)이란 스케일의 시작음을 뜻합니다. 기본적으로 C에서부터 시작하고, 첫 번째 악보의 근음은 C입니다. 이것을 바꾸고 싶다면 transpose 파라미터로 설정합니다. 만약 D를 근음으로 하고 싶다면 2를 입력하고 (C – C# -D) 11을 입력하면 B가 됩니다. (C – C# – … – A# -B). 이 두 파라미터를 받아서 전체 스케일 노트 목록을 산출한 다음 json으로 각종 정보와 함께 변환합니다.
// scale.php?pattern=412212&transpose=3 { "notesByName":[ "E-", "G", "A-", "B-", "C", "C+", "E-" ], "notesBySemitone":[ 8, 9, 11, 13, 14, 16 ], "root":"E-", "name":"example name", "pattern":"412212" }
empty(각종변수);
는 변수가 빈 값('')
이거나 null
인지 검사합니다. 파라미터를 입력할 때 이 파라미터가 비어있거나 아예 존재하지 않는지를 체크할 때 사용하면 좋습니다.
str_split(스트링변수);
는 스트링을 문자 단위로 쪼갭니다. “ABCDE”는 “A”, “B”, “C”, “D”, “E”로 쪼개집니다.
array("notesByName" => $output_arr, ... );
이 부분은 연관 배열을 선언하는 부분입니다. 연관 배열은 자바스크립트의 객체와 성질이 유사합니다. 앞부분이 key, 뒷부분이 value입니다.
header('Content-Type: application/json');
는 헤더를 설정하는 부분으로 이 출력 결과를 json포맷으로 내보내겠다고 선언하는 부분이며, echo json_encode(배열);
을 통해 배열 등을 json 포맷에 맞게 변환하여 내보냅니다.
0개의 댓글