<?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);
?>

view raw

scale.php

hosted with ❤ by GitHub

이 예제는 개인 작업중인 내용을 주요 부분만 추출한 것으로, 패턴(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 포맷에 맞게 변환하여 내보냅니다.

문의 | 코멘트 또는 yoonbumtae@gmail.com


카테고리: WEB: BackendPHP


0개의 댓글

답글 남기기

Avatar placeholder

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다