Musica: cosa c'è in questo accordo?


38

Ingresso

Il simbolo di qualsiasi accordo triadico (vedi http://en.wikipedia.org/wiki/Chord_(music)#Triads ).

Produzione

Le note che costituiscono l'accordo dato.

Esempi

Ingresso: AM Uscita:A C# E

Ingresso: C#m Uscita:C# E G#

Ingresso: Db+ Uscita:C# F A

Ingresso: C0 Uscita:C D# F#

bonus

-50 se riesci anche a gestire gli accordi del settimo

-150 per suonare effettivamente il suono dell'accordo

-150 per l'uso di caratteri stampabili per mostrare come suonare l'accordo su un piano; esempio per AM:

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

-100 per l'utilizzo di caratteri stampabili per mostrare come suonare l'accordo su una chitarra; esempio per AM:

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

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

Regole

  • Il risultato deve essere un programma o uno script da riga di comando.

  • L'input e l'output possono essere in qualsiasi forma, purché seguano uno standard di notazione musicale.

  • Una rappresentazione di chitarra o piano è considerata valida se e solo se contiene le tre (triadiche) o quattro (settime) note richieste e nient'altro. La stessa nota può essere presente più volte nell'accordo.

  • Le librerie esterne non sono consentite, ad eccezione della generazione del suono (nel qual caso le direttive #include, import... non vengono aggiunte al conteggio dei caratteri).

  • Questo è il codice golf, vince il codice più corto!

Un po 'di teoria musicale ...

Nella moderna musica tonale occidentale, ogni ottava è composta da dodici note successive, spesso annotate:

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

O:

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

In questo sistema, si considera che due note successive (ad esempio Ae A#, oppure Ee F) sono separati da un semitono. Inoltre, le note sono in qualche modo "looping": ciò che segue immediatamente G#è A.

Costellazione del passo

Un accordo è costituito da poche (2, 3, 4, a volte più) note che "suonano bene insieme". Ad esempio, gli accordi triadici contengono tre note diverse e il settimo accordo contiene quattro note diverse.

Definiamo i quattro accordi triadici come:

  • Triade maggiore : contiene la radice dell'accordo (in questa domanda, la nota fornita come input), il terzo maggiore per la radice (4 semitoni più in alto della radice) e il quinto perfetto per la radice (7 semitoni in più della radice ); questo può essere simbolizzato 0-4-7

  • Triade minore , simboleggiata 0-3-7

  • Triade aumentata , simboleggiata 0-4-8

  • Triade ridotta , simboleggiata 0-3-6

Costellazioni del passo: triadi

Così, per esempio, se si vuole fare una triade C , ha osservato C, CM, Cmaj, avrete bisogno di tre notare:

  • 0: la radice , in questo caso aC
  • 4: il terzo minore , 4 semitoni più alti della radice; questo è unE
  • 7: il quinto perfetto , 7 semitoni più in alto della radice: aG

Questo è ciò che il 0-4-7, 0-3-7, 0-4-8e 0-3-6notazioni utilizzate sopra media! Per il settimo accordo, usa il seguente schema:

Constallazioni di tono: settimi accordi

Questo è tutto per oggi! Ora, stupiscimi con un codice straordinario ... Se hai qualche domanda, aggiungi alcuni commenti qui sotto.


1
Potrebbe valere la pena aggiungere una spiegazione che includa le formule degli accordi in notazione intera per non musicisti. La notazione intera si riferisce a tutto in semitoni. Accordo maggiore (esempio AM): 0,4,7. Accordo minore (esempio C # m): 0,3,7. C diminuito (Esempio Co, o come lo chiami C0) 0,3,6 (nota che la rappresentazione corretta è C Eb Gb, ma per questa sfida immagino che possiamo accettare sia questo che CD # F # sono accettabili.) La formula per un accordo aumentato (Esempio Db +) è 0,4,8 e il tuo esempio è sbagliato in quanto non contiene nemmeno un Db. Come scritto è un B + che equivale a un D # + o G +
Level River St

3
Inoltre, il codice più corto risulterà dall'uso della stessa forma di accordo per tutti gli accordi di chitarra dello stesso tipo, esclusi. Quindi Ab sarà una forma A barrata all'11 ° tasto. Va bene mettere un numero o dobbiamo disegnare 11 tasti? Tutto sommato, ci sono molte cose a cui pensare. Potresti voler semplificare i bonus.
Level River St

1
Mmm .. il tuo accordo aumentato è ancora sbagliato. C # è enarmonico a Db, ma Db+è Db F Anon c'è nessun D # o G in là. È forse un po 'più teoria del necessario, le formule erano la parte importante. Se vuoi davvero includere tutti e otto gli accordi del settimo elencati in Wikipedia, devi specificare l'input. Presumo che l'output di arte ascii di piano e chitarra sia flessibile.
Level River St

3
Mi sembra di aver imparato di più sulla teoria musicale qui di quanto non abbia imparato dalle lezioni.
Kevin Evans,

4
Il problema più interessante di questo sito!
Ray

Risposte:


5

BBC BASIC

Emulatore su bbcbasic.co.uk

Rev 1, 340-150 tastiera - 150 giocando = 40

Ecco l'ultima versione, in cui sono riuscito a includere i seguenti miglioramenti mentre allungavo solo alcuni caratteri in più.

L'input può essere modificato comodamente sullo schermo prima di premere Invio (prima utilizzavo GET $ per ottenere i singoli tasti premuti, poiché BBC Basic non ti consente di accedere a un singolo carattere da una stringa come se la stringa fosse un array. Ora uso piuttosto ingombrante funzione MID $ per estrarre una stringa di un carattere all'interno della stringa.

Vengono visualizzati entrambi i lati della tastiera e l'intera riga tra E e F.

Per compensare i caratteri aggiunti da quanto sopra, ho riorganizzato il programma per eliminare le dichiarazioni di stampa non necessarie e ho eliminato uno spazio bianco che a prima vista sembrava non poter essere eliminato. IN BBC Basic tutte le funzioni integrate sono parole riservate e puoi mettere un nome di variabile proprio davanti a loro senza spazio in mezzo. I nomi delle variabili non possono iniziare con una parola riservata. Per rendere il programma meno confuso da leggere, ho modificato tutte le variabili in lettere minuscole.

Sebbene la presentazione appaia molto migliore, il seguente programma è già completamente golfato. (Vedi correzione di seguito). Generalmente newline e due punti sono intercambiabili, tranne quando viene utilizzata un'istruzione IF. In tal caso, tutte le istruzioni sulla stessa riga (separate da due punti) devono essere eseguite in modo condizionale. Le dichiarazioni dopo la nuova riga non sono controllate dall'IF e verranno sempre eseguite.

Programma giri 1 340 caratteri

  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

CORREZIONE: BBC BASIC di RT Russell per Windows consente di eliminare alcune nuove righe e due punti, portando il totale a 327, vedi sotto. Inoltre trasforma le parole chiave in caratteri singoli prima di salvarle, portandole a 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

Uscita rev 1

inserisci qui la descrizione dell'immagine

Rev 0, 337-150 tastiera - 150 giocando = 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

Questo è un concetto simile alla mia risposta di Arduino, ma ho sempre saputo che avrei potuto battere quel numero di byte con BBC Basic. Riconosce solo gli oggetti taglienti, ma considera B # non valido, devi mettere C. Questo potrebbe essere risolto se fosse davvero considerato importante.

Ho abbandonato l'idea della chitarra e mi sono concentrato sul miglioramento della tastiera. Ora passa da C a B e ho aggiunto nella parte sinistra della tastiera e la linea tra E e F. Il costo è di 28 caratteri. La parte destra non sarebbe molto di più.

Ecco alcuni output di esempio, un accordo A # diminuito (che ha un suono piuttosto strano in questa inversione) e un accordo di Do maggiore. Si noti che l'ingresso non viene ripetuto sullo schermo. Secondo la risposta di Arduino, girare lo schermo in senso antiorario per vederlo.

inserisci qui la descrizione dell'immagine

Versione Ungolfed

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

Come dovrebbe essere usato il programma dalla riga di comando? (Ho installato BBC BASIC sulla mia macchina Ubuntu)
Mathieu Rodic,

Wow, non sapevo che esistesse una versione della BBC di base per Ubuntu. Non riesco a trovarne uno sul sito da cui ho ricevuto il mio emulatore e non utilizzo Ubuntu. La BBC originale di base aveva solo un programma alla volta, quindi hai digitato RUN. Con l'emulatore che uso devi avviare l'ambiente dell'emulatore, quindi viene eseguito al suo interno. Ha un editor di testo, quindi fai clic per eseguire, quindi quando il programma termina puoi digitare RUN per eseguire nuovamente il programma o digitare singoli comandi Basic all'interno dell'ambiente. Puoi produrre un eseguibile da riga di comando con il mio emulatore, ma solo se acquisti la versione completa.
Level River St

Se vuoi testare il programma, il modo migliore che posso aiutarti è se riesci a trovare un computer Windows e scaricare la versione esatta che sto usando. In alternativa, se potessi dirmi da dove hai preso la tua versione di Ubuntu, potrei leggerne un po '.
Level River St

BBC Basic funziona anche su Linux, forniscono molte distribuzioni sulla loro home page a seconda del sistema operativo host. Semplicemente non sono riuscito a far funzionare il programma, né passando il codice o incollandolo nel prompt ...
Mathieu Rodic,

Ho appena scaricato Napoleon Brandy Basic, ed è davvero difficile iniziare! È necessario salvare il codice come file di testo chiamato chords.nap, quindi digitare LOAD "chords.nap" al prompt dei comandi. Aggiunge numeri di riga al codice (più autentici alla BBC Basic originale, aggiungerebbe qualche altro carattere) Quindi digiti RUN e il programma si arresta in modo anomalo sulla riga con l'istruzione SOUND in esso, con il messaggio di errore "Funzionalità Basic V non supportata trovato." Potresti davvero scrivere un programma serio con l'implementazione di RT Russell se davvero lo volessi. Ma con Brandy basic non ci penserei nemmeno.
Level River St

8

Come puoi dire, non ho provato a giocare a golf. Sono un fanatico della musica, e una mia piccola pipì è quando le persone scrivono cose usando gli enharmonics sbagliati (ad esempio dicendo che un accordo diminuito in C è CD # F # invece di C Eb Gb), quindi ho scritto questo programma che ottiene gli enharmonics destra. Lo fa rappresentando ogni nota come il numero di quinte perfette sopra F.

Per quello che vale, se vuoi distinguere gli enarmonici, qualsiasi intervallo musicale può essere rappresentato in modo gradevole in un programma per computer come un numero di quinte perfette e un numero di ottave. Un quarto aumentato, ad esempio, è di 6 quinte perfette e -3 ottave, e una quinta diminuita è di -6 quinte perfette e 4 ottave.

Haskell, 441 personaggi

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

Alcune invocazioni di esempio:

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

Arduino

Ingresso / uscita viene inviato / ricevuto da Arduino tramite una porta COM. Un utente può interagire con questo tramite un terminale o il monitor seriale nell'IDE di Arduino. Come avrai intuito dalla mia scelta della piattaforma, sto pensando di includere l'esecuzione effettiva dell'accordo (anche se non l'ho ancora fatto).

Ho affrontato con successo il bonus della tastiera e ho cercato di affrontare la chitarra, con un successo limitato.

La scatola di accordi arriva a 130 byte, che è troppo lungo per valerne la pena. Quindi ho provato un altro modo, semplicemente stampando i numeri dei tasti in stile Tab. Attualmente questo è 81 byte per un bonus di 81-100 = -19. Se questo approccio è ritenuto valido, posso provare a migliorarlo.

Gli accordi utilizzati sono tutte forme di tipo D con la radice sulla seconda corda, la quinta sulla terza corda e la terza sulla prima e quarta corda. La quinta e la sesta stringa non vengono utilizzate e segnalo con le X sulla destra della scatola degli accordi (la sinistra sarebbe più usuale, ma si possono trovare esempi segnati sulla destra).

Poiché il programma considera F come la nota più bassa (per compatibilità con la tastiera evitando tasti eccessivamente alti con questa forma di accordo) l'accordo più alto è una E (con radice sul 17 ° tasto). Vedi l'output di esempio.

La tastiera ha più successo in termini di golf. Funziona da FE piuttosto che da CB per i motivi sopra descritti. Deve essere visualizzato ruotando lo schermo del 90% in senso antiorario, quando è possibile vedere chiaramente i contorni delle note nere e la demarcazione tra le note bianche con ---. La linea tra B e C potrebbe essere estesa con alcuni ____per qualche byte in più.

Proverò a suonare le note dopo. Questo sarà interessante perché, anche se credo che Arduino Uno abbia 3 timer interni, è possibile suonare una sola nota alla volta usando il comando di tono incorporato. Esiste una funzione di libreria esterna che utilizza tutti i timer hardware (che rovinano il seriale, ma non sarà comunque necessario in quella fase.) In alternativa, posso provare a produrre i toni in softare.

Se avrò successo, lo giocherò ma non credo che sarà il vincitore assoluto.

Codice 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));
  }  
}

Output di esempio Più bassa è la spaziatura tra le righe di testo, migliore sarà l'aspetto. Quindi sembra fantastico quando sto effettivamente modificando il post, ma orribile nella casella grigia dopo la pubblicazione. Invece ho pubblicato uno screenshot del monitor seriale Arduino con interlinea intermedia (e quindi qualità di visualizzazione).

inserisci qui la descrizione dell'immagine


Non vedo l'ora per il suono reale!
Mathieu Rodic,

Le note per EM sono corrette (EG # B), ma non sono allineate correttamente sulla tastiera. Sembra però che tu sia sulla buona strada!
Cameron Tinker,

@CameronTinker Inclina lo schermo di 90 gradi in senso antiorario e guarda di nuovo. Nota che la tastiera funziona da F a E, non da C a B per i motivi descritti nel mio post. La scelta di F come "nota zero" interna è stata un compromesso sia per la chitarra che per la tastiera. Ci sono 3 note nere a sinistra, 2 a destra e le note di output sono allineate correttamente. L'estensione della divisione tra B e C renderebbe più chiaro, ma costerebbe circa 20 byte extra. È rozzo, ma penso ancora che la mia tastiera sia più leggibile di quella di Pandubear.
Level River St

Non so come mi sia perso! Mi dispiace per quello. Sono un pianista e la mia prima inclinazione quando ho visto questo era che la tastiera non sembrava corretta;).
Cameron Tinker,

@MathieuRodic Adesso ho dei suoni fuori dall'Arduino, ma sono così poveri che non sono sicuro che li definirei un accordo riconoscibile. Proverò ancora, ma con Arduino stanno accadendo alcune cose che non capisco. Ad ogni modo, ho appena pubblicato una risposta in BBC Basic con tastiera e audio che sembrano molto migliori. Quindi aggiornerò questo post in seguito
Level River St

4

Python3 - 315 caratteri

Prima volta in codegolf! Supporta solo accordi minori, maggiori, diminuiti e aumentati in questo momento.

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
Utilizzare al 'C C# D D# E F F# G G# A A# B'.split(' ')posto dell'array letterale per salvare alcuni byte.
mercoledì

2
if('#'in a):j+=1-> if'#'in a:j+=1= 2 caratteri in meno per ogni istruzione. Anche il passaggio ya range()un'espressione salva anche qualcosa. Benvenuto! (e ricorda che anche le nuove righe contano;))
gcq

2
@wch È possibile salvare più byte con 'C C# D D# E F F# G G# A A# B'.split();)
undergroundmonorail

1
Come hai contato il tuo punteggio? Penso che devi contare anche nuove righe come un carattere ciascuno. A proposito, poiché questa risposta funziona solo in Python3, modificherò la tua risposta per affermarla esplicitamente. Inoltre, invece di utilizzare yper archiviare [1,2,4,5,6], perché non saltare semplicemente ye sostituire la riga 4 con for i in[1,2,4,5,6]:? Ad ogni modo, benvenuto su codegolf e spero che ti diverta qui.
pastebin.com slash 0mr8spkT

1
Puoi anche salvare altri 3 caratteri rientrando con un solo spazio anziché quattro nella riga 5.
pastebin.com slash 0mr8spkT

4

Python 506 (unicode come 1 carattere) -150 (suono) -150 (tastiera) = 206

Per la riproduzione del suono, utilizza pygame.midi. Si noti che il pygame.midi.get_default_output_id()metodo non funziona molto bene. Così si può provare a cambiare la linea o=Output(get_default_output_id())a o=Output(1), o=Output(2), ecc Di solito il valore corretto è compreso tra 0 e 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))

risultati

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 caratteri

Autonomo, legge dall'input della console. Se hai bisogno di stdin, cambia la finale 1in a 3. Non richiede bonus e copre solo le triadi.

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

Invece di una nota acuta, ad esempio, C#è necessario utilizzare il nome piatto equivalente Db. (Correggere per questo aumenterebbe il codice di più di un po '.) I quattro tipi di accordi sono 0per diminuire, mper minore, Mper maggiore e +per potenziato.

La logica è la seguente: usiamo l'ultimo carattere per aggiungere un offset alla base 0-3-6, che seleziona il tipo di terzo e quinto. Nel frattempo, usiamo la nota per trovare da dove nella scala estrarre le note. L' ;:sia rende nota compatibile con indicizzazione nella bilancia alla partenza, e successivamente (dai &.) trasforma le note tirato in uno spazio separato stringa.

Esempio di utilizzo:

   +/&(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

Il suffisso 'h' segue uno degli "standard di notazione musicale"?
Mathieu Rodic

@MathieuRodic Suppongo che sia una zona grigia, quindi li ho portati tutti agli appartamenti. Nessun cambiamento nella funzionalità. Non so perché non l'ho fatto prima.
algoritmo

2

Javascript, 224 caratteri

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])

Questo è il mio primo codice golf. Penso che possa essere più breve, ma non riesco a trovare alcun byte da salvare.

Supporti grandi, mper minori, 0per diminuita, +per aumentati o più 37 byte per dim, aug.


n[m]==0può essere semplicemente !n[m]. Lo stesso vale in un altro posto. In totale puoi tagliare facilmente 6 caratteri .
Gaurang Tandon,

@GaurangTandon Poiché nè stringa, n[m]==0verrà eseguito il cast 0a "0", quindi è uguale a n[m]=="0". "0" == 0è vero, ma !"0"è falso.
Spuntino il

Stavo solo sottolineando perché ho avuto lo stesso output quando ho inserito AM. Potrei anche sbagliarmi.
Gaurang Tandon,

2

Python ( 143 134 caratteri)

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]) 

La mia prima sfida di golf :), non so se è possibile eliminare qualche altro byte.
La notazione usata qui è * aug / + maj /, min / - dim
Mi merito un punto bonus per avere la costante 42 nel codice: P


È possibile ottenere alcuni byte in questo modo: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

Python 3: 257-150 = 107

Solo 25 caratteri troppo a lungo per battere la soluzione J! Oh bene. Ci sono alcune idee pulite qui, penso.

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,' #','  '))

L'input è come negli esempi, anche se è necessario utilizzare nomi nitidi invece di nomi semplici. (es. Gb deve essere F #)

L'uscita è una singola ottava di un piano, vista dall'alto e a sinistra, con i nomi delle note sovrapposti. Dovrebbe essere solo un piccolo tratto dell'immaginazione.

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

Bel lavoro! Anche se non vedo le note da suonare nell'output? Perché CM, dovremmo essere in grado di leggere C E G...
Mathieu Rodic,

Oh, ho frainteso la domanda che suppongo. Vediamo se riesco a
farlo

Fisso! Troppo lungo... ):
pandubear

Non puoi sostituirlo bool(R)conR|0 ?
Mathieu Rodic,

No, il punto è che R è un elenco ed bool(R)è 1 (vero) se non vuoto e 0 (falso) se vuoto. L' |operatore non lavora con gli elenchi ...
pandubear

1

Scala 537 caratteri - 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

Haskell, 273 caratteri

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

risultati

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"]    
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.