음악 :이 화음에는 무엇이 있습니까?


38

입력

3 음 코드의 상징 ( http://en.wikipedia.org/wiki/Chord_(music)#Triads 참조 )

산출

주어진 화음을 구성하는 음표.

예

입력 : AM 출력 :A C# E

입력 : C#m 출력 :C# E G#

입력 : Db+ 출력 :C# F A

입력 : C0 출력 :C D# F#

보너스

일곱 번째 화음도 다룰 수 있으면 -50

실제로 코드의 사운드를 연주하기위한 -150

피아노에서 코드를 연주하는 방법을 보여주기 위해 인쇄 가능한 문자 사용을위한 -150 ; 예 AM:

┌─┬─┬┬─┬─┬─┬─┬┬─┲┱─┬─┬─┲━┱┬─┲━┱─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ┃┃ │ │ ┃ ┃│ ┃ ┃ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┲┛┗┱┘ │ ┗┯┛└┲┛ ┃ └┬┘└┬┘└┬┘ │
│  │  │  │  │  ┃  ┃  │  │  ┃  ┃  │  │  │  │
└──┴──┴──┴──┴──┺━━┹──┴──┴──┺━━┹──┴──┴──┴──┘

인쇄 가능한 문자를 사용하여 기타에서 코드를 연주하는 방법을 보여주는 -100 ; 예 AM:

x   o   o   o   o   o
┌───┬───┬───┬───┬───┐
│   │   │   │   │   │
├───┼───┼───┼───┼───┤
│   │   │   │   │   │
├───┼───┼───┼───┼───┤
│   │   █   █   █   │
├───┼───┼───┼───┼───┤
│   │   │   │   │   │

( https://en.wikipedia.org/wiki/Box-drawing_character 참조 )

규칙

  • 결과는 명령 행 프로그램 또는 스크립트 여야합니다.

  • 음악 표기법 표준을 따르는 한 입력 및 출력은 어떤 형태로든 가능합니다.

  • 기타 또는 피아노 표현은 3 개 또는 3 개의 필수 음표를 포함하고 다른 것이없는 경우에만 유효한 것으로 간주됩니다. 같은 음이 코드에 여러 번 나타날 수 있습니다.

  • 사운드 생성을 제외하고 외부 라이브러리는 허용되지 않습니다 (이 경우 #include, import... 지시문은 문자 수에 추가되지 않습니다).

  • 이것은 코드 골프이며, 가장 짧은 코드가 승리합니다!

약간의 음악 이론 ...

현대 서양 음색 음악에서 모든 옥타브는 12 개의 연속 음으로 만들어지며 종종 다음과 같이 지적합니다.

A A# B C C# D D# E F F# G G#

또는:

La La# Si Do Do# Re Re# Mi Fa Fa# Sol Sol#

이 시스템에서는 두 개의 연속 음표 (예 : A및 A#, 또는 E및 F)가 하나의 반음으로 분리되어 있다고 간주 합니다. 또한 노트는 일종의 "루핑" G#입니다 A. 바로 다음에 나오는 것은 입니다.

피치 별자리

화음은 "함께 잘 들린다"는 몇 가지 (2, 3, 4, 때로는 더 많은) 음표로 구성됩니다. 예를 들어, 3 음 코드 에는 3 개의 다른 음이 포함되어 있으며 7 번째 코드 에는 4 개의 다른 음이 있습니다.

3 개의 3 가지 코드 를 다음과 같이 정의 해 봅시다 :

  • 메이저 트라이어드 : 코드의 근음 (이 질문에서 입력으로 주어진 음표), 근음의 주요 3 분의 1 (근음보다 4 반음 높음) 및 근음의 5 분의 1 (근음보다 7 반음 높음)을 포함합니다 ); 이것은 0-4-7로 상징 될 수있다

  • 작은 트라이어드 ( 기호 0-3-7)

  • 증강 트라이어드 , 상징화 된 0-4-8

  • 축소 된 트라이어드 , 상징화 된 0-3-6

피치 별자리 : 트라이어드

당신이 만들고 싶어한다면, 예를 들어, C 메이저 3 화음 언급을, C, CM, Cmaj, 세 가지가주의해야합니다 :

  • 0 : 루트 ,이 경우C
  • 4 : 마이너 3 , 루트보다 4 반음 높음; 그건E
  • 7 : 루트보다 높은 5 분 의 7 반음 :G

이것은 무엇인가 0-4-7, 0-3-7, 0-4-8및 0-3-6표기법이 평균 이상 사용! 일곱 번째 화음에는 다음 패턴을 사용하십시오.

피치 별자리 : 일곱 번째 화음

그게 오늘이야! 이제 놀라운 코드로 놀라게 해주세요. 궁금한 점이 있으면 아래에 의견을 추가하십시오.


1
음악가가 아닌 사람을 위해 정수 표기법으로 코드에 대한 공식을 포함하여 설명을 추가하는 것이 좋습니다. 정수 표기법은 모든 것을 반음으로 나타냅니다. 메이저 코드 (예 AM) : 0,4,7. 작은 화음 (예 : C # m) : 0,3,7. C가 감소했습니다 (예제 Co 또는 C0이라고 함) 0,3,6 (올바른 표현은 C Eb Gb 임에 유의하십시오. 그러나이 도전에 대해서는 이것과 CD # F #이 모두 수용 가능하다고 가정 할 수 있습니다.) 증강 코드 (예 : Db +)의 경우 0,4,8이고 Db를 포함하지 않으므로 예제가 잘못되었습니다. 작성된 바와 같이 그것은 B #이며 D # + 또는 G +에 해당합니다
— Level River St

3
또한, 가장 짧은 코드는 같은 형식의 모든 기타 코드에 대해 같은 코드 모양을 사용함으로써 발생합니다. Ab는 11 번 프렛에서 금지 된 A 모양입니다. 숫자를 입력해도 괜찮습니까? 아니면 11 프렛을 그려야합니까? 대체로 생각해야 할 것이 많습니다. 보너스를 단순화하고 싶을 수도 있습니다.
— Level River St

1
흠 .. 당신의 강화 된 코드는 여전히 잘못되었습니다. C #은 DB에 분음하지만 Db+입니다 Db F A더 D # 또는 G 거기에가 없습니다. 그것은 아마도 필요한 것보다 조금 더 이론 일 것입니다. 공식은 중요한 부분이었습니다. 위키 백과에 나열된 일곱 번째 코드 중 여덟 개를 모두 포함하려면 입력을 지정해야합니다. 피아노와 기타의 아스키 아트 (Ascii-Art) 출력이 유연하다고 가정합니다.
— Level River St

3
수업에서 배운 것보다 음악 이론에 대해 더 많이 배운 것 같습니다.
— Kevin Evans

4
이 사이트에서 가장 멋진 문제!
— Ray

답변:


5

BBC 기본

bbcbasic.co.uk의 에뮬레이터

개정 1, 340-150 키보드-150 연주 = 40

여기에 몇 가지 문자 만 더 늘리면서 다음 개선 사항을 포함시킬 수있는 최신 버전이 있습니다.

Return 키를 누르기 전에 화면에서 입력을 편안하게 편집 할 수 있습니다 (BBC Basic에서는 문자열이 배열 인 것처럼 문자열에서 단일 문자에 액세스 할 수 없기 때문에 단일 키를 누르기 전에 GET $를 사용했습니다). bulky MID $ 함수는 문자열 내에서 한 문자의 문자열을 추출합니다.

키보드의 양쪽과 E와 F 사이의 전체 라인이 표시됩니다.

위에서 추가 한 문자를 보완하기 위해 불필요한 인쇄 문을 제거하기 위해 프로그램을 재정렬하고 처음에는 삭제할 수없는 것처럼 보이는 공백을 삭제했습니다. BBC Basic에서는 모든 내장 함수가 예약어이며, 그 사이에 공백없이 변수 이름을 바로 붙일 수 있습니다. 변수 이름은 예약어로 시작할 수 없습니다. 프로그램을 읽기 어렵게 만들기 위해 모든 변수를 소문자로 변경했습니다.

프레젠테이션은 훨씬 나아 보이지만 다음 프로그램은 실제로 완전히 골프입니다. IF 문을 사용하는 경우를 제외하고 일반적으로 줄 바꿈과 콜론은 서로 바꿔 사용할 수 있습니다 (아래 수정 참조). 이 경우 같은 줄에있는 모든 명령문 (콜론으로 구분)이 조건부로 실행됩니다. 개행 이후의 명령문은 IF에 의해 제어되지 않으며 항상 실행됩니다.

프로그램 개정 1340 자

  a$="C#D#EF#G#A#B0Mm+"
  INPUTx$
  r=INSTR(a$,LEFT$(x$,1))-1
  c=INSTR(a$,MID$(x$,2,1))
  IFc=2c=INSTR(a$,MID$(x$,3)):r=r+1
  t=(r+4-c MOD2)MOD12
  f=(r+c DIV2)MOD12
  v=1
  FORn=-1TO11
  c=1-(n<0ORn=4ORn=11)*5
  b$=MID$(a$,n+1,1)
  IFb$="#"c=11:b$=MID$(a$,n,1)+b$
  c$=MID$("   _______--|__",c,5)
  IFr=n ORt=n ORf=n c$=c$+b$:SOUNDv,-15,100+n*4,99:v=v+1
  PRINTc$
  NEXT

수정 : RT Russell의 Windows 용 BBC BASIC을 사용하면 줄 바꿈과 콜론을 제거하여 총계를 327로 줄일 수 있습니다 (아래 참조). 또한 저장하기 전에 키워드를 단일 문자로 토큰 화하여 279로 줄입니다.

  a$="C#D#EF#G#A#B0Mm+"INPUTx$
  r=INSTR(a$,LEFT$(x$,1))-1c=INSTR(a$,MID$(x$,2,1))IFc=2c=INSTR(a$,MID$(x$,3))r=r+1
  t=(r+4-c MOD2)MOD12f=(r+c DIV2)MOD12v=1FORn=-1TO11c=1-(n<0ORn=4ORn=11)*5b$=MID$(a$,n+1,1)IFb$="#"c=11b$=MID$(a$,n,1)+b$
  c$=MID$("   _______--|__",c,5)IFr=n ORt=n ORf=n c$=c$+b$SOUNDv,-15,100+n*4,99v=v+1
  PRINTc$
  NEXT

출력 레브 1

여기에 이미지 설명을 입력하십시오

Rev 0, 337-150 키보드-150 연주 = 37

A$="C#D#EF#G#A#B0Mm+":X$=GET$:R=INSTR(A$,X$)-1:X$=GET$:IF X$="#"R=R+1:X$=GET$
C=INSTR(A$,X$):T=(R+4-C MOD2)MOD12:F=(R+C DIV2)MOD12:V=1:PRINT"______"
FORN=0 TO 11
C=1-(N=4)*12:B$=MID$(A$,N+1,1): IF B$="#" C=7: B$=MID$(A$,N,1)+B$
PRINT MID$("    __---|________",C,6);:IF(R-N)*(T-N)*(F-N)=0 PRINT B$;:SOUND V,-15,100+N*4,99:V=V+1
PRINT
NEXT

이것은 Arduino 답변과 비슷한 개념이지만 BBC 기본으로 바이트 수를 이길 수 있다는 것을 항상 알고있었습니다. 샤프 만 인식하지만 B #이 유효하지 않다고 간주하면 C를 넣어야합니다. 실제로 중요하다고 생각되면이 문제를 해결할 수 있습니다.

나는 기타에 대한 생각을 버리고 키보드 개선에 집중했다. 이제 C에서 B로 실행되며 키보드의 왼쪽과 E와 F 사이의 줄에 추가했습니다. 28 자의 비용이 듭니다. 오른쪽은 그다지 많지 않습니다.

다음은 샘플 출력, A # 감소 코드 (이 반전에서 꽤 이상한 소리를냅니다) 및 B 메이저 코드입니다. 입력은 화면에 에코되지 않습니다. Arduino 답변에 따라 화면을 시계 반대 방향으로 돌려서 봅니다.

여기에 이미지 설명을 입력하십시오

언 골프 버전

A$="C#D#EF#G#A#B0Mm+"                              :REM Note names and chord type names fit very conveniently in the same string.
X$=GET$                                            :REM Get a character 
R=INSTR(A$,X$)-1                                   :REM Root note = position of that char in A$. INSTR starts counting at 1, but we want 0, so subtract.
X$=GET$                                            :REM If the root note is natural, the next character will be the chord type. But...
IF X$="#"R=R+1:X$=GET$                             :REM If this char is # we need to increment the root, and get another char for chord type. 
C=INSTR(A$,X$)                                     :REM C encodes for chord type
T=(R+4-C MOD2)MOD12                                :REM even C means major third, odd C means minor third
F=(R+C DIV2)MOD12                                  :REM "Mm" gives C=14,15 meaning C DIV2=7 (perfect fifth.) C=13,16 give diminished and augmented: 6,8.
V=1                                                :REM V is the sound channel number ("voice")                             
PRINT"______"                                      :REM left side of keyboard for cosmetic reasons
FORN=0 TO 11                                       :REM at the start of each iteration initialise C to 1, to point to the 4 spaces/2 underscores in the string below for drawing white notes. 
  C=1-(N=4)*12                                     :REM if the note is E, add 12 so it points to the 6 underscores to draw the line between E and F. 
  B$=MID$(A$,N+1,1)                                :REM load B$ with the name of the current note.
  IF B$="#" C=7: B$=MID$(A$,N,1)+B$                :REM if the character encountered is a sharp, update C to point the characters for drawing a sharp. Find the previous character in A$ and join it to the beginning of B$ to complete the note name.
  PRINT MID$("    __---|________",C,6);            :REM print the key (6 characters.)
  IF(R-N)*(T-N)*(F-N)=0 PRINT B$;:SOUND V,-15,100+N*4,99:V=V+1  :REM if N is equal to R,T or F, print the note name beside the key, play the note and increment the channel number for the next note.  
  PRINT                                            :REM print a carriage return. It may be possible to golf this line out.
NEXT

명령 줄에서 프로그램을 어떻게 사용합니까? (내 우분투 시스템에 BBC 기본 설치)
— 마티유 Rodic

와우, 나는 우분투에 대한 BBC 기본 버전이 있다는 것을 몰랐다. 에뮬레이터가있는 사이트에서 찾을 수 없으며 Ubuntu를 사용하지 않습니다. 원래 BBC 기본에는 한 번에 하나의 프로그램 만 메모리에 있었으므로 RUN을 입력했습니다. 에뮬레이터를 사용하면 에뮬레이터 환경을 시작한 다음 그 환경에서 실행해야합니다. 텍스트 편집기가 있고 클릭하여 실행 한 다음 프로그램이 종료되면 RUN을 입력하여 프로그램을 다시 실행하거나 환경 내의 개별 기본 명령을 입력 할 수 있습니다. 내 에뮬레이터로 명령 행 실행 파일을 생성 할 수 있지만 정식 버전을 구입 한 경우에만 가능합니다.
— Level River St

프로그램을 테스트하려면 Windows 시스템을 찾고 사용중인 정확한 버전을 다운로드 할 수 있습니다. 또는 우분투 버전을 어디에서 얻었는지 말해 주시면 조금 읽을 수 있습니다.
— Level River St

BBC Basic은 Linux에서도 실행되며 호스트 OS에 따라 홈 페이지에 많은 배포를 제공합니다. 난 그냥 코드를 전달하거나 프롬프트에 붙여 넣지 않고 프로그램을 실행하지 못했습니다 ...
— Mathieu Rodic

방금 Napoleon Brandy Basic을 다운로드했는데 실제로 시작하기가 어렵습니다! 코드를 chords.nap이라는 텍스트 파일로 저장 한 다음 명령 프롬프트에서 LOAD "chords.nap"을 입력해야합니다. 코드에 줄 번호를 추가합니다 (원래 BBC Basic에 더 정통하고 몇 문자를 더 추가합니다) 그런 다음 RUN을 입력하면 SOUND 문이있는 줄에서 프로그램이 충돌하고 "지원되지 않는 기본 V 기능 녹이다." 실제로 원한다면 RT Russell의 구현으로 심각한 프로그램을 작성할 수 있습니다. 그러나 브랜디 기본으로 나는 그것에 대해 생각조차하지 않을 것입니다.
— Level River St

8

당신이 알 수 있듯이, 나는 이것을 전혀 골프하려고하지 않았습니다. 나는 음악 괴짜이며, 내 애완 동물은 사람들이 잘못된 감정을 사용하여 물건을 쓸 때입니다 (예를 들어 C 감소 코드는 C Eb Gb 대신 CD # F #이라고 말함). 권리. 각 음표를 F 이상의 완벽한 5 분의 수로 표현하면됩니다.

가치있는 것에 대해, 당신이 조화를 구별하고 싶다면, 어떤 음악 간격도 컴퓨터 프로그램에서 완벽한 5 분의 1과 많은 옥타브로 멋지게 표현 될 수 있습니다. 예를 들어, 증가 된 4 번째는 6 퍼펙트 5와 -3 옥타브이고, 감소 된 5 번째는 -6 퍼펙트 5와 4 옥타브입니다.

하스켈, 441 자

import Data.List

notes = "FCGDAEB"

fromNum x = [notes !! (mod x 7)] ++ if x < 0 then replicate (-(div x 7)) 'b' else replicate (div x 7) '#'

toNum (x:xs) = y + 7 * if isPrefixOf "b" xs then -length xs else length xs
    where Just y = elemIndex x notes

chord xs = unwords . map (fromNum . \x -> toNum (init xs) + x) $ case last xs of 'A' -> [0,4,8]; 'M' -> [0,4,1]; 'm' -> [0,-3,1]; 'd' -> [0,-3,-6]

main = getLine >>= putStrLn . chord

몇 가지 예제 호출 :

jaspers:junk tswett$ ./chord
AM
A C# E
jaspers:junk tswett$ ./chord
C#m
C# E G#
jaspers:junk tswett$ ./chord
DbA
Db F A
jaspers:junk tswett$ ./chord
Cd
C Eb Gb
jaspers:junk tswett$ ./chord
A#M
A# C## E#
jaspers:junk tswett$ ./chord
Dbm
Db Fb Ab

5

아두 이노

입력 / 출력은 COM 포트를 통해 Arduino와 송수신됩니다. 사용자는 터미널 또는 Arduino IDE의 직렬 모니터를 통해 이와 상호 작용할 수 있습니다. 내가 선택한 플랫폼에서 짐작할 수 있듯이 실제 코드 연주를 포함시킬 계획입니다 (아직 수행하지는 않았지만).

나는 키보드 보너스를 성공적으로 다루었 고 제한된 성공으로 기타를 다루려고 노력했습니다.

코드 박스는 130 바이트로 제공되므로 너무 길어 가치가 없습니다. 따라서 프렛 번호 탭 스타일을 인쇄하는 다른 방법을 시도했습니다. 현재 이것은 81-100 = -19의 보너스로 81 바이트입니다. 이 접근법이 유효한 것으로 간주되면 시도하고 개선 할 수 있습니다.

사용 된 화음은 두 번째 줄에 근이, 세 번째 줄에 다섯 번째, 첫 번째와 네 번째 줄에 세 번째 뿌리가있는 모든 D 형 도형입니다. 5 번째와 6 번째 문자열은 사용되지 않으며 코드 상자의 오른쪽에 X로 표시합니다 (왼쪽이 더 일반적이지만 오른쪽에 표시된 예는 찾을 수 있습니다).

프로그램은 F를 가장 낮은 음으로 간주하기 때문에 (이 코드 모양으로 과도하게 높은 프렛을 피하면서 키보드와의 호환성을 위해) 가장 높은 코드는 E입니다 (17 프렛에 근음이 있습니다). 출력 예를 참조하십시오.

골프면에서 키보드가 더 성공적입니다. 위에서 설명한 이유로 CB가 아닌 FE에서 실행됩니다. 검은 색 음표의 윤곽과 흰색 음표 사이의 경계를 명확하게 볼 수있을 때 화면을 시계 반대 방향으로 90 % 돌려서 확인해야합니다 ---. B와 C 사이의 선은 ____몇 바이트 더 연장 될 수 있습니다 .

다음에 음을 연주 해 보겠습니다. Arduino Uno에는 3 개의 내부 타이머가 있다고 생각하지만 내장 톤 명령을 사용하여 한 번에 하나의 음만 연주 할 수 있기 때문에 이것은 흥미로울 것입니다. 모든 하드웨어 타이머를 사용하는 외부 라이브러리 기능이 있습니다 (직렬을 엉망으로 만들지 만 어쨌든 그 단계에서는 필요하지 않습니다). 그렇지 않으면 softare에서 톤을 생성하려고 시도 할 수 있습니다.

내가 그 일에 성공하면 골프를 밟을 것이지만 그것이 전체 승자가 될 것이라고는 생각하지 않습니다.

Ungolfed 코드

String p="F#G#A#BC#D#E -Mm+",y,d[]=
{"    ","---|"},n="\n";

void setup() {
  Serial.begin(9600);
  Serial.setTimeout(99999);
}

void loop(){
  char x[9]; int r,t,f,i,c=1;
  Serial.readBytesUntil(13,x,9);
  Serial.println(x);  
  r=p.indexOf(x[0]);
  if (x[1]==35|x[1]==98){c=2;r+=x[1]==35?1:-1;}
  f=p.indexOf(x[c])/2;
  t=4-p.indexOf(x[c])%2;

  //chord box
  y=n;for(i=24;i--;)y+=d[1]+(i%4?"":" \n");
  y[89]=y[107]='X'; y[t*4-10]=y[t*4+52]=y[f*4+14]=y[28]='O';
  Serial.print("\t "+String(r+6)+y);

  f+=r;t+=r;

  //tab style
  Serial.println(String(t+1)+n+String(r+6)+n
  +String(f-2)+n+String(t+3)+"\nX\nX\n");

  f%=12;t%=12;

  //piano
  for(i=0;i<12;i++){
    c=0;
    y=String(p[i]);
    if(y=="#") {c=1;y=p[i-1]+y;}      
    Serial.println(d[c]+"__"+((r-i&&t-i&&f-i)?"":y));
  }  
}

샘플 출력 텍스트 줄 사이의 간격이 낮을수록 더 좋습니다. 따라서 실제로 게시물을 편집 할 때 멋지지만 게시 후 회색 상자에는 끔찍합니다. 대신 중간 줄 간격 (따라서 표시 품질) 인 Arduino 직렬 모니터의 스크린 샷을 게시했습니다.

여기에 이미지 설명을 입력하십시오


실제 소리를 기다릴 수 없습니다!
— Mathieu Rodic

EM에 대한 메모는 정확하지만 (EG # B) 키보드에서 올바르게 정렬되지 않았습니다. 그래도 당신이 올바른 길을 가고있는 것 같습니다!
— Cameron Tinker

@CameronTinker 화면을 시계 반대 방향으로 90도 기울여 다시보십시오. 내 게시물에 설명 된 이유로 키보드는 C에서 B가 아닌 F에서 E로 실행됩니다. 내부 "제로 노트"로 F를 선택하는 것은 기타와 키보드 출력 모두에서 타협했습니다. 왼쪽에는 3 개의 검은 색 노트가 있고 오른쪽에는 2 개의 검은 색 노트가 있으며 출력 노트는 올바르게 정렬됩니다. B와 C 사이의 구분을 확장하면 더 명확 해지지 만 약 20 바이트의 추가 바이트가 필요합니다. 조잡하지만 여전히 Pandubear보다 키보드가 더 읽기 쉽다고 생각합니다.
— Level River St

나는 그것이 어떻게 그리웠는지 모른다! 미안합니다. 나는 피아니스트이고 이것이 처음 보였을 때 키보드가 제대로 보이지 않았다는 것이 었습니다;).
— Cameron Tinker

@MathieuRodic 나는 지금 Arduino에서 소리를 냈지만, 너무 가난하여 나는 그것들을 인식 할 수있는 화음이라고 부를 것입니다. 나는 다른 시도를 할 것이지만, 내가 이해하지 못하는 Arduino에서 일어나는 몇 가지 일이 있습니다. 어쨌든 방금 BBC Basic에서 키보드와 사운드로 훨씬 더 나은 답변을 게시했습니다. 나중에이 게시물을 업데이트하겠습니다
— Level River St

4

Python3-315 자

codegolf에서 처음으로! 현재는 마이너, 메이저, 축소 및 증강 코드 만 지원합니다.

z=["C","C#","D","D#","E","F","F#","G","G#","A","A#","B"];y=[1,2,4,5,6]
def q(a):print(z[a%12])
a=input();k=(ord(a[0])+3)%7;j=k;m=4;s=0;f=7;
for i in y:
    if(k>=i):j+=1
if('#'in a):j+=1
if('b'in a):j-=1
if('m'in a or'0'in a):m=3
if('+'in a or"aug"in a):f=8
if('0'in a or"dim"in a):f=6;m=3
if('ma'in a):m=4
q(j);q(j+m);q(j+f);

2
'C C# D D# E F F# G G# A A# B'.split(' ')리터럴 배열 대신 사용 하여 일부 바이트를 저장하십시오.
— wchargin

2
if('#'in a):j+=1if'#'in a:j+=1모든 문장에 대해 -> = 2 문자가 적습니다. 또한 변화하는 yA와 range()표현이 너무 뭔가를 저장합니다. 어서 오십시오! (그리고 줄 바꿈도 중요하다는 것을 기억하십시오)
— gcq

2
@wch 'C C# D D# E F F# G G# A A# B'.split();) 로 더 많은 바이트를 저장할 수 있습니다 .
— undergroundmonorail 1

1
당신은 어떻게 점수를 세었습니까? 새로운 줄을 각각 하나의 문자로 계산해야한다고 생각합니다. 그건 그렇고,이 답변은 Python3에서만 작동하므로 명시 적으로 설명하도록 답변을 편집하겠습니다. 또한 y을 저장하는 대신을 사용하여 4 행을 [1,2,4,5,6]생략하고 ? 어쨌든, codegolf에 오신 것을 환영합니다. yfor i in[1,2,4,5,6]:
— ace_HongKongIndependence

1
5 번째 줄에 4 개가 아닌 1 개만 들여 쓰기하여 3 개 문자를 더 절약 할 수도 있습니다.
— ace_HongKongIndependence

4

Python 506 (1 문자로 유니 코드) -150 (사운드) -150 (키보드) = 206

소리 재생에는을 사용합니다 pygame.midi. 이 pygame.midi.get_default_output_id()방법은 잘 작동하지 않습니다. 그래서 당신은 라인 o=Output(get_default_output_id())을 변경하려고 할 수 있습니다o=Output(1) , o=Output(2)등 일반적으로 올바른 값은 0과 5 사이입니다.

c=input()
s='C D EF G A B'.index(c[0])+{'#':1,'b':-1,'':0}[c[1:-1]]
m='0mM+'.index(c[-1])
t=s+3+m//2
R=[list(x)for x in['┌─'+'─┬─'*13+'─┐']+['│'+'  │'*14]*5+['└─'+'─┴─'*13+'─┘']]
i=3
for d in[3,6,3,3,6]*2:q=slice(i-1,i+2);R[0][q]='┬─┬';R[1][q]=R[2][q]=R[3][q]='│ │';R[4][q]='└┬┘';i+=d
X=[2]+[1,2,1,2,3,1,2,1,2,1,2,3]*2
from pygame.midi import*
init()
o=Output(get_default_output_id())
for s in[s,t,t+3+m%2]:R[[5,3][s%12 in[1,3,6,8,10]]][sum(X[:s+1])]='o';o.note_on(s+60,127,1)
for r in R:print(''.join(r))

결과

goooolf> python chords2.py
CM
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│ o│  │ o│  │ o│  │  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
Cm
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││o│ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│ o│  │  │  │ o│  │  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
Dm
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │ o│  │ o│  │ o│  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
D+
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │o││ ││o│ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │ o│  │  │  │  │  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
G+
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││o│ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │  │  │  │ o│  │ o│  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
Am
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │  │  │  │  │ o│  │ o│  │ o│  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
C#0
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │o││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │  │ o│  │ o│  │  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘
goooolf> python chords2.py
EbM
┌─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┬─┬─┬┬─┬─┬─┬─┬┬─┬┬─┬─┐
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││ │ │ │ ││ ││ │ │ │ ││ │ │ │ ││ ││ │ │
│ │ ││o│ │ │ ││ ││o│ │ │ ││ │ │ │ ││ ││ │ │
│ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │ └┬┘└┬┘ │ └┬┘└┬┘└┬┘ │
│  │  │  │  │ o│  │  │  │  │  │  │  │  │  │
└──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┴──┘

3

J-82 자

독립형, 콘솔 입력에서 읽습니다. stdin이 필요한 경우 마지막 1을로 변경하십시오 3. 보너스를 청구하지 않고 트라이어드 만 포함합니다.

+/&(0 3 6++/\_3{.#:'0mM+'i.{:e)&.((,~C`Db`D`Eb`E`F`Gb`G`Ab`A`Bb`B)i.;:)}:e=.1!:1]1

예 C#를 들어 똑같은 메모 를 사용해야합니다 Db. (이를 수정하면 코드가 조금씩 늘어납니다.) 네 가지 코드 유형은 0감소, m사소한, M메이저 및+ 늘어납니다 확장을위한 것입니다.

논리는 다음과 같습니다. 마지막 문자를 사용하여 기본 0-3-6에 오프셋을 추가하여 세 번째와 다섯 번째 종류를 선택합니다. 한편, 우리는 음표를 사용하여 음계를 어디에서 끌어낼 수 있는지 찾습니다. 은 ;:모두 시작에 규모에 색인과 호환, 나중에 (기준 메모 만드는 &.공간으로 끌어 노트 문자열을 분리집니다)를.

사용법 예 :

   +/&(0 3 6++/\_3{.#:'0mM+'i.{:e)&.((,~C`Db`D`Eb`E`F`Gb`G`Ab`A`Bb`B)i.;:)}:e=.1!:1]1
AM
A Ch E
   +/&(0 3 6++/\_3{.#:'0mM+'i.{:e)&.((,~C`Db`D`Eb`E`F`Gb`G`Ab`A`Bb`B)i.;:)}:e=.1!:1]1
Ab0
Ab B D
   +/&(0 3 6++/\_3{.#:'0mM+'i.{:e)&.((,~C`Db`D`Eb`E`F`Gb`G`Ab`A`Bb`B)i.;:)}:e=.1!:1]1
B+
B Eb G
   +/&(0 3 6++/\_3{.#:'0mM+'i.{:e)&.((,~C`Db`D`Eb`E`F`Gb`G`Ab`A`Bb`B)i.;:)}:e=.1!:1]1
Em
E G B

접미사 'h'가 '음악 표기법 표준'중 하나를 따르나요?
— Mathieu Rodic

@MathieuRodic 나는 그것이 회색 영역이라고 가정합니다. 기능에는 변화가 없습니다. 내가 왜 이것을 일찍하지 않았는지 모르겠다.
— algorithmshark

2

자바 스크립트, 224 자

n=prompt();a="A0A#0B0C0C#0D0D#0E0F0F#0G0G#".split(0);x=1;r=a.indexOf(n[0]);n[1]=="#"&&(r++,x++);n[1]=="b"&&(r--,x++);s=r+4;l=r+7;(n[x]=="m"||n[x]==0)&&s++;s%=12;n[x]=="+"&&l++;n[x]==0&&l--;l%=12;alert(a[r]+" "+a[s]+" "+a[l])

이것은 나의 첫 번째 코드 골프입니다. 나는 그것이 더 짧을 수 있다고 생각하지만 저장할 바이트를 찾을 수 없습니다.

메이저, m마이너, 0축소, +확장 또는 37 바이트를 더 지원dim , aug.


n[m]==0간단하게 될 수 있습니다 !n[m]. 다른 곳에서도 동일하게 적용됩니다. 총 6자를 쉽게 잘라낼 수 있습니다 .
— Gaurang Tandon

이후 @GaurangTandon는 n문자열 인, n[m]==0캐스팅됩니다 0에 "0"이 같음, 그래서 n[m]=="0". "0" == 0사실이지만 !"0"거짓입니다.
— Snack

입력 할 때 동일한 출력을 얻었 기 때문에 방금 지적했습니다 AM. 나도 틀렸을 수도 있습니다.
— Gaurang Tandon

2

파이썬 ( 143134 문자)

n,a='A A# B C C# D D# E F F# G G#'.split(),input();m,i=ord(a[-1])-42,n.index(a[:-1])
print(n[i],n[(i+4-m//2)%12],n[(i-4+(-m//2))%12]) 

내 첫 번째 골프 도전 :), 더 많은 바이트를 깎을 수 있는지 모르겠습니다.
여기에 사용 된 표기법은 * aug / + maj /, min /-dim
입니다. 코드에 상수 42가있는 보너스 포인트가 필요합니다.


다음과 같이 몇 바이트를 얻을 수 있습니다.n,q,a='A A# B C C# D D# E F F# G G#'.split(),[4,4,3,3],input();m,i=ord(a[-1])-42,n.index(a[:-1])
— Mathieu Rodic

1

파이썬 3 : 257-150 = 107

J 솔루션을 이길 수있는 길이는 25 자입니다! 오 잘 여기에는 몇 가지 깔끔한 아이디어가 있습니다.

I='AaBCcDdEFfGg'*2
Q='0123456789.,'*2
K="""-1#_2
-,#_0
-9#_.
____8
-6#_7
-4#_5
____3"""
r,*R,q=input()
r=I.find(r)+bool(R)
p=str.replace
for x in[0]+[8,4,7,3,6]['+Mm0'.find(q):][:2]:K=p(K,Q[x+r],I[x+r].upper())
for x in Q:K=p(K,x,' ')
print(p(K,' #','  '))

입력은 예와 같지만 플랫 이름 대신 선명한 이름을 사용해야합니다. (예 : Gb는 F #이어야합니다)

아웃풋은 한 옥타브의 피아노로, 위와 왼쪽에서 볼 수 있으며 음 이름이 겹쳐져 있습니다. 상상의 작은 스트레칭 일 것입니다.

$ echo C#m | python3 chords.py
-  _ 
-G#_ 
-  _ 
____ 
-  _E
-C#_ 
____ 

좋은 작업! 그래도 출력에서 ​​연주 할 음표가 보이지 않습니까? 를 위해 CM, 우리는 읽을 수 있어야합니다 C E G.
— Mathieu Rodic

오, 나는 내가 생각하는 질문을 잘못 해석했다. 내가 그 일을 할 수 있는지 보자 ...
— pandubear

결정된! 너무 길다 ...) :
— pandubear

당신은 대체 할 수 없습니다 bool(R)와 함께 R|0?
— Mathieu Rodic

아냐, 요점은 R이 목록이고 bool(R)비어 있지 않으면 1 (참)이고 비어 있으면 0 (거짓)이라는 것입니다. |운영자는 ... 목록 작동하지 않습니다
— pandubear

1

스칼라 537 자-50

import java.util.Scanner
object C extends App{
val c=Map("M"->145,"m"->137,"+"->273,"0"->73,"7"->1169,"M7"->2193,"m7"->1161,"Mm7"->2185,"+7"->1297,"+M7"->2321,"07"->585,"7b5"->1097)
val n=List("A","A#","B","C","C#","D","D#","E","F","F#","G","G#")
val o=List("","Bb","Cb","B#","Db","","Eb","Fb","E#","Gb","","Ab")
val s=new Scanner(System.in).nextLine
val v=s indexWhere{c=>c!='#'&&c!='b'&&(c<'A'||c>'G')}
val (u,m)=s splitAt v
val x=n.indexOf(u)max o.indexOf(u)
val k=c(m)
for(i<-0 to 11)if((k&(1<<i))!=0)print(n((i+x)%12)+" ")
println}

0

하스켈, 273 자

n(s,a)="CCDDEFFGGAABB"!!(s+1-a):["b#"!!a|" b b  b b b "!!s/=' ']
t p=[(s,a)|s<-[11,10..0],a<-[0,1],n(s,a)==p]!!0
m(s,d)=n(mod s 12,d-3)
c q=[n(a,x),m(a+d,d),m(a+d+e,e)]where
 (a,x)=t$init q;f=lookup(last q).zip"0mM+";Just d=f[3,3,4,4];Just e=f[3,4,3,4]
main=print.c=<<getLine

결과

C0 ->["C","Eb","Gb"]   Cm ->["C","Eb","G"]    CM ->["C","E","G"]     C+ ->["C","E","G#"]    
C#0->["C#","F","G"]    C#m->["C#","F","G#"]   C#M->["C#","F","Ab"]   C#+->["C#","F","A"]    
D0 ->["D","F","Ab"]    Dm ->["D","F","A"]     DM ->["D","F#","A"]    D+ ->["D","F#","A#"]   
D#0->["D#","Gb","A"]   D#m->["D#","Gb","A#"]  D#M->["D#","G","Bb"]   D#+->["D#","G","B"]    
E0 ->["E","G","Bb"]    Em ->["E","G","B"]     EM ->["E","G#","B"]    E+ ->["E","G#","C"]    
F0 ->["F","Ab","B"]    Fm ->["F","Ab","C"]    FM ->["F","A","C"]     F+ ->["F","A","C#"]    
F#0->["F#","A","C"]    F#m->["F#","A","C#"]   F#M->["F#","A#","Db"]  F#+->["F#","A#","D"]   
G0 ->["G","Bb","Db"]   Gm ->["G","Bb","D"]    GM ->["G","B","D"]     G+ ->["G","B","D#"]    
G#0->["G#","B","D"]    G#m->["G#","B","D#"]   G#M->["G#","C","Eb"]   G#+->["G#","C","E"]    
A0 ->["A","C","Eb"]    Am ->["A","C","E"]     AM ->["A","C#","F"]    A+ ->["A","C#","F"]    
A#0->["A#","Db","F"]   A#m->["A#","Db","F"]   A#M->["A#","D","F"]    A#+->["A#","D","F#"]   
B0 ->["B","D","F"]     Bm ->["B","D","F#"]    BM ->["B","D#","Gb"]   B+ ->["B","D#","G"]    
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.