กำลังสร้างแท็บกีตาร์หรือไม่


24

เขียนโปรแกรมที่สั้นที่สุดที่สร้างแท็บกีต้าร์สำหรับคอร์ดที่ได้รับเป็นอินพุต

เพื่อให้มือกีต้าร์ในหมู่คุณไม่มีข้อได้เปรียบและเพื่อให้มันกำหนดขึ้น (และอาจง่ายกว่าในการเขียนโค้ด) นี่คือรูปแบบเดียวของคอร์ดที่ได้รับอนุญาต:

Major chords:

  E   F   F#  G   G#  A   A#  B   C   C#  D   D#
e 0---1---2---3---4---0---1---2---3---4---5---6---
B 0---1---2---3---4---2---3---4---5---6---7---8---
G 1---2---3---4---5---2---3---4---5---6---7---8---
D 2---3---4---5---6---2---3---4---5---6---7---8---
A 2---3---4---5---6---0---1---2---3---4---5---6---
E 0---1---2---3---4---0---1---2---3---4---5---6---

Minor chords:

  Em  Fm  F#m Gm  G#m Am  A#m Bm  Cm  C#m Dm  D#m
e 0---1---2---3---4---0---1---2---3---4---5---6---
B 0---1---2---3---4---1---2---3---4---5---6---7---
G 0---1---2---3---4---2---3---4---5---6---7---8---
D 2---3---4---5---6---2---3---4---5---6---7---8---
A 2---3---4---5---6---0---1---2---3---4---5---6---
E 0---1---2---3---4---0---1---2---3---4---5---6---

โปรดทราบว่า 5 คอร์ดแรกและ 7 คอร์ดสุดท้ายของแต่ละชุดมีรูปแบบที่แตกต่างกัน

คอร์ดทั้งหมดเป็นคอร์ดหลักหรือคอร์ดเล็กน้อย (ไม่มี 7 หรือรูปแบบอื่น ๆ )

คุณควรดูแลแฟลตด้วย การแจ้งเตือน:

A# = Bb
C# = Db
D# = Eb
F# = Gb
G# = Ab

B#, Cb, E# and Fb are not used

เอาต์พุตจะต้องมีคอลัมน์แรกที่มีชื่อสายไฟดังที่แสดงไว้ด้านบน มันไม่จำเป็นต้องรวมชื่อคอร์ดด้านบน คอร์ดจะต้องคั่นด้วย 3 -ตามที่แสดงด้านบน 3 ขั้นสุดท้าย-เป็นตัวเลือก

อินพุตเป็นสตริงที่ประกอบด้วยชื่อคอร์ดคั่นด้วยช่องว่าง

ตัวอย่างอินพุตคือ:

Bm Gb A E G D Em F#

และผลลัพธ์ที่สอดคล้องกันคือ:

e 2---2---0---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---

... และคำถามข้างเคียง: เพลงตัวอย่างคืออะไร? :)
Jules Olléon

5
โรงแรมแคลิฟอร์เนีย: P
Matthew อ่าน

ใช่คุณชนะ! :)
Jules Olléon

ไอเดียเด็ด ๆ หวังว่าฉันจะมีเวลาเล่น!
Igby Largeman

คำตอบ:


9

JavaScript, 297 277 262 235 223 ตัวอักษร

ไม่มีผลตอบแทนการขนส่งในเวอร์ชั่นของกอล์ฟที่มีนัยสำคัญ พวกเขาอยู่ที่นั่นเพียงเพื่อให้คำตอบอ่านได้ อัฒภาคมีความสำคัญ

แก้ไข:แทนที่ด้านนอกmapด้วยขณะที่ลูปและการแก้ไขอื่น ๆ ในที่สุดภายใน 2 ×ขนาดของรุ่น Golfscript (ตอนนี้)!

แก้ไข:แทนที่indexOfด้วยคณิตศาสตร์ทำลายตารางการค้นหาการปรับปรุงเล็กน้อยอื่น ๆ

แก้ไข:อีกmapไปforและใส่ในขั้นสุดท้าย\nที่ฉันได้รับการรับประทานอาหารที่ไม่จำเป็น ในที่สุดก็อยู่ในรุ่น Python ของ Jules

i=prompt(o='').split(' ');for(r=6;o+=' EADGBe'[r]+' ',r--;o+='\n')
for(j=0;n=i[j++];o+=(([84,13,52,5][2*/m/.test(n)+x]*8>>2*r&3)+y-7*x)+'---')
y=n.charCodeAt(0),y=(2*y-(y>66)-(y>69)+(n[1]<'$')-(n[1]=='b')+2)%12,x=y>6;alert(o)

เอาต์พุตไม่ได้ใช้ประโยชน์จากการติดตามอีกต่อไป---ซึ่งเป็นทางเลือกเช่น:

e 2---2---0---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---

ประณามฉันมี javascript peen-envy ฉันคิดว่า ทำได้ดีมาก
kekekela

7

Golfscript, 136 ตัวอักษร

[["eBGDAE"{[]+" "+}/]]\" "/{.-2\{"bm#A B C D E F G"?.)!!*(+}/14%.3>-.8>-.7/@109?0>2*+[963 780 882 753]{3base(;}%=\7%{+'---'+}+%}%+zip n*

ครบ 23 ตัวอักษร (17.5%) จัดการกับตัวละครทั้งสองที่จุดเริ่มต้นของแต่ละแถวออก

ตัวอย่างผลลัพธ์การทดสอบขอบเคส:

$ golfscript.rb tabs.gs <<<"E G# Ab A Db D# Em G#m Abm Am D#m"
e 0---4---4---0---4---6---0---4---4---0---5---
B 0---4---4---2---6---8---0---4---4---1---6---
G 1---5---5---2---6---8---0---4---4---2---7---
D 2---6---6---2---6---8---2---6---6---2---7---
A 2---6---6---0---4---6---2---6---6---0---5---
E 0---4---4---0---4---6---0---4---4---0---5---

ฉันเพิ่งใช้เวลาประมาณหนึ่งชั่วโมงกับเรื่องนี้ดังนั้นมันอาจจะลดลงได้ 5 ถึง 10 ตัวอักษรอย่างน้อย แนวคิดมันคล้ายกับโซลูชันของ DocMax: ตารางการค้นหาสำหรับสี่กรณีจากนั้นเพิ่มขึ้นด้วยออฟเซ็ตและเข้าร่วมสตริงในลำดับที่ถูกต้อง


+1: ผู้ชายฉันรัก Golfscript! วันนี้หลายต่อหลายครั้งฉันพบสถานที่ที่จะตัดรหัสของฉัน แต่ไม่ใช่ 50%! ฉันไม่มีล่ามสะดวก: มันส่งคืน D # สำหรับ Eb หรือไม่
DocMax

BTW บันทึกย่อสุดท้ายในตัวอย่างของคุณตรงกับ C # m แม้ว่าบรรทัดคำสั่งจะแสดง D # m พิมพ์ผิดหรือข้อผิดพลาด?
DocMax

@DocMax ข้อผิดพลาด ฉันไม่เข้าใจว่าทำไมมันส่งผลกระทบต่อ D # เพียงอย่างเดียวและไม่ใช่ D # - สิ่งนี้จะน่าสนใจสำหรับการดีบัก ฉันจัดลำดับสิ่งต่าง ๆ ใหม่เนื่องจากสะดวกในการบล็อก 7 ก่อนดังนั้น Eb จึงไม่ใช่กรณีที่แท้จริง
ปีเตอร์เทย์เลอร์

กลับกลายเป็นว่าคนสุดท้ายที่ได้รับ \ n รวมอยู่ซึ่งไม่ได้อยู่ในตารางการค้นหาได้ดึงค่าลงโดยเทียบเท่าตัวอักษร
Peter Taylor

4

หลังจากเขียนโค้ดนี้ขึ้นฉันก็ตระหนักว่าฉันทำได้ดีกว่านี้มาก ... บางทีฉันอาจจะเข้ามาอีกครั้ง หวังว่าฉันจะได้รับคะแนนจากการเป็นคนที่เร็วที่สุด!

อย่างไรก็ตามมี Perl 962 ตัว

%c =(B=>{E=>0,F=>1,Gb=>2,G=>3,Ab=>4,A=>2,Bb=>3,B=>4,C=>5,Db=>6,D=>7,Eb=>8,Em=>0,Fm=>1,Gbm=>2,Gm=>3,Abm=>0,Am=>1,Bbm=>2,Bm=>3,Cm=>4,Dbm=>5,Dm=>6,Ebm=>7},G=>{E=>1,F=>2,Gb=>3,G=>4,Ab=>5,A=>2,Bb=>3,B=>4,C=>5,Db=>6,D=>7,Eb=>8,Em=>0,Fm=>1,Gbm=>2,Gm=>3,Abm=>4,Am=>2,Bbm=>3,Bm=>4,Cm=>5,Dbm=>6,Dm=>7,Ebm=>8},D=>{E=>2,F=>3,Gb=>4,G=>5,Ab=>6,A=>2,Bb=>3,B=>4,C=>5,Db=>6,D=>7,Eb=>8,Em=>2,Fm=>3,Gbm=>4,Gm=>5,Abm=>6,Am=>2,Bbm=>3,Bm=>4,Cm=>5,Dbm=>6,Dm=>7,Ebm=>8},A=>{E=>2,F=>3,Gb=>4,G=>5,Ab=>6,A=>0,Bb=>1,B=>2,C=>3,Db=>4,D=>5,Eb=>6,Em=>2,Fm=>3,Gbm=>4,Gm=>5,Abm=>6,Am=>0,Bbm=>1,Bm=>2,Cm=>3,Dbm=>4,Dm=>5,Ebm=>6},E=>{E=>0,F=>1,Gb=>2,G=>3,Ab=>4,A=>0,Bb=>1,B=>2,C=>3,Db=>4,D=>5,Eb=>6,Em=>0,Fm=>1,Gbm=>2,Gm=>3,Abm=>4,Am=>0,Bbm=>1,Bm=>2,Cm=>3,Dbm=>4,Dm=>5,Ebm=>6});
%b=('A#'=>'Bb','C#'=>'Db','D#'=>'Eb','F#'=>'Gb','G#'=>'Ab');
foreach(qw(e B G D A E)){p($_,@ARGV)}
sub p{$s = shift;print "$s ";$s = uc($s);foreach(@_){while(($h,$f)=each(%b)){s/$h/$f/}print "$c{$s}->{$_}---"}print "\n"}

นี่คือผลลัพธ์ที่สอดคล้องกัน

dhrasmus:Desktop standage$ perl guitar Bm Gb A E G D Em F#
e 2---2---0---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---

4

เนื่องจากวิธีแก้ปัญหาที่สั้นกว่านั้นได้รับมาแล้ว (คุณคือ GolfScript!) นี่คือของฉัน:

Python 229 ตัวอักษร

s=[("E EmF FmF#GbG GmG#AbA AmA#BbB BmC CmC#DbD DmD#Eb".find("%-02s"%s[:2])/4,s[-1]!='m')for s in raw_input().split()]
for c in range(6):
 l='eBGDAE'[c]+' '
 for(i,M)in s:x=i>4;l+=`i-5*x+2*(2<c+x<5)+(M+x)*(c==2-x)`+"---"
 print l

เอาท์พุท:

> echo "Bm Gb A E G D Em F#" | python guitar.py
e 2---2---0---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---

3

Python 449 ตัวอักษร

z=int
f=str
r=range
j=''.join
n='E F F# G G# A A# B C C# D D#'.split()
n+=[x+'m'for x in n]
c=[j([f(z(x)+i)for x in'001220'])for i in r(5)]+[j([f(z(x)+i)for x in'022200'])for i in r(7)]
c+=[x[:2]+f(z(x[2])-1)+x[3:]for x in c[:5]]+[x[0]+f(z(x[1])-1)+x[2:]for x in c[5:]]
a=[c[n.index((chr(ord(i[0])-1)+'#'+i[2:]).replace('@','G')if len(i)-1 and i[1]=='b'else i)]for i in raw_input().split()] 
for i in r(6):print'eBGDAE'[i],j([x[i]+'-'*3 for x in a])

3

C99 - 231 ตัวอักษร

คอร์ดจะได้รับในบรรทัดคำสั่งหนึ่งอาร์กิวเมนต์ต่อคอร์ดและแน่นอนว่าไม่มีการตรวจสอบอินพุตใด ๆ

#include<stdio.h>
int main(int c,char**v){for(char*o="e0)B2)G2*D2+A0+E0)",i,m;*o;o+=3,v-=c,puts(""))for(printf("%c ",*o);*++v;printf("%c---",i-(i>2)-i/9+o[1+i/8]-(*o-66-i/8*5?0:m?m+2[*v]>99:0)))m=1[*v],i=(**v*2-4+m/35-m/98*3)%14;}

วิ่งตัวอย่าง:

$ ./a.out Bm Gb A E G D Em F#
e 2---2---0---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---

ยกเลิกแข็งแรงเล่นกอล์ฟ

#include<stdio.h>
int main(int c,char**v){
     // o points to three characters per output line:
     //   string name, number for A, adjusted number for E (ASCII code minus 7)
     char* o="e0)B2)G2*D2+A0+E0)",
          i, // chord: A=0, A#=1, ..., G#=13, allowing also 3="E#" and 9="B#"
          m; // second character in chord name
     for (; *o; o+=3) {
          printf("%c ", *o);
          for (; *++v; ) {
               m = 1[*v],
               i = (**v*2-4+m/35-m/98*3)%14; // parse & adjust for sharp, flat
               printf("%c---",
                      i-(i>2)-i/9 // eliminate "E#", "B#"
                      +o[1+i/8] // get the number for a major chord
                      // adjust for minor...
                      -(*o-66-i/8*5
                        ? 0
                        : m ? m+2[*v]>99 : 0));
          }
          v -= c; // rewind argument pointer
          puts("");
     }
}

ไม่เป็นมาตรฐาน C - 206 ตัวอักษร

หากเราไม่สนใจข้อกำหนดทางภาษา GCC สามารถรวบรวมหนึ่งซับในต่อไปนี้เป็นไบนารีที่ใช้งานได้แม้ว่าจะผสมการประกาศตัวแปร C99 ด้วยการประกาศอาร์กิวเมนต์สไตล์ K&R (และการประกาศโดยปริยายของ printf)

main(c,v)char**v;{for(char*o="e0)B2)G2*D2+A0+E0)",i,m;*o;o+=3,v-=c,puts(""))for(printf("%c ",*o);*++v;printf("%c---",i-(i>2)-i/9+o[1+i/8]-(*o-66-i/8*5?0:m?m+2[*v]>99:0)))m=1[*v],i=(**v*2-4+m/35-m/98*3)%14;}

2

C ++, 432

#include <cmath>
#include <iostream>
F(int c){c-=65;return c*1.6+sin(c/5.+.3);}
T(int a,int s){if(s)return(a=(T(a,s-1)+2)%3)-=(a==1&s>2);return(a<7)*2;}
#define c(a,b) while(*(++j)==a)b;--j; 
#define O std::cout<<
main(int a,char*p[]){
int P=2;for(int i=-1;++i<6;P=2){O p[1][i];O" ";while(P<a){char*j=p[P++];
int f=F(*j);c('#',++f)c('b',--f)
int t=T(f,i)*3.5;if(*(++j)!='m'){--j;t+=(t==3);}
O(f-F(p[1][i])+t+24)%12;O"---";
}O'\n';}}

โปรดทราบว่าสิ่งนี้ต้องการการปรับจูนกีตาร์เป็นพารามิเตอร์แรก (การปรับจูนที่ไม่ได้มาตรฐานส่วนใหญ่จะให้ผลการเจาะนิ้วที่ไร้สาระ แต่ฉันคิดว่าคุณพอใจกับการจูนแบบมาตรฐาน)

สำหรับ Hotel California $./a.out EBGDAE Cbm Gb Bbb Fb G D Em F# Bm F# G## D## F## C## D##m E##ที่คุณสามารถทำได้ ผล:

E 2---2---0---0---3---5---0---2---2---2---5---0---3---5---0---2---
B 3---2---2---0---3---7---0---2---3---2---5---0---3---7---0---2---
G 4---3---2---1---4---7---0---3---4---3---6---1---4---7---0---3---
D 4---4---2---2---5---7---2---4---4---4---7---2---5---7---2---4---
A 2---4---0---2---5---5---2---4---2---4---7---2---5---5---2---4---
E 2---2---0---0---3---5---0---2---2---2---5---0---3---5---0---2---

การปรับสายสี่ส่วนบนเป็นสายที่สามทำให้ง่ายต่อการเล่นคอร์ดสามและสี่สายในการเล่นหลายครั้งโดยไม่ต้องเปิดสายและไม่ต้องวางนิ้ว "เหนือ" สายโดยไม่ต้องสัมผัส การใช้สตริง DFG # B ลำดับคอร์ดเช่น "Bbm F Bbm Gb Db Ebm Db F Bbm F7 Bbm" (เพลงนางเงือก) ทำงานได้อย่างง่ายดายมาก มีความจำเป็นต้องเลื่อนขึ้นและลงหนึ่งครั้งทำให้ไม่สบายใจ มีการเปลี่ยนคีย์ครึ่งขั้น แต่นั่นหมายถึงการทำให้หงุดหงิด ไม่ได้คิดออกว่าจะทำอย่างไรดีที่สุดกับอีกสองสายแม้ว่า
supercat

@supercat: น่าสนใจฉันจะลองใช้กับกีตาร์ของฉันพรุ่งนี้ ...
หยุดหมุน counterclock ซึ่ง

ฉันอยากได้ยินสิ่งที่คุณคิด ฉันหยิบกีต้าร์ขึ้นมาสองสามครั้งแยกกันหลายปีและเลิกเล่นไปเรื่อย ๆ เพราะดูเหมือนว่าทั้งนิ้วและโดยพลการ จากนั้นฉันก็ต้องคิดเกี่ยวกับสิ่งที่จูนเนอร์จะช่วยให้นิ้วง่าย เนื่องจากคอร์ดแบบฟอร์มปิดมีช่วงเวลาซึ่งมีตั้งแต่เล็กน้อยที่สามถึงสี่ที่สมบูรณ์แบบสตริงการปรับไปที่สามรองหมายความว่าแต่ละสตริงจะทำให้ชื้นที่จุดซึ่งไม่ต่ำกว่าสตริงด้านล่าง ถ้าฉันสามารถลองกีต้าร์มือซ้ายฉันอาจลองที่สี่ที่สมบูรณ์แบบด้วยคำสั่งสตริงกลับด้านเนื่องจากมันควรจะคล้ายกัน
supercat

ตามที่เป็นอยู่การปรับจูนที่สามหมายความว่าสำหรับแต่ละตำแหน่งของนิ้วแรกบนสตริงที่ต่ำที่สุดจะมีการสลับคอร์ดที่สำคัญสามครั้งและการสลับคอร์ดที่สามเล็กน้อยที่มี ท่านสามารถเล่นคอร์ดที่เจ็ดโดยการวางนิ้วที่สองในสามสาย สำหรับเพลงนางเงือกเริ่มต้นกับเฟร็ทที่สามแล้วเล่น F-Bb-DF (ใช้นิ้ว 1-3-3-4) จากนั้น F คือ FACF (1-2-2-4) Gb หงุดหงิด, มือไว 1-2-2-4 (เช่น F) Db กลับมาไม่สบายใจ 1-3-4-4 Ebm สำรอง 1-2-4-4
supercat

ฉันใช้เวลาเพียงไม่กี่ชั่วโมงเพื่อไปยังจุดที่ฉันสามารถเล่นบางชิ้นได้อย่างราบรื่น (รวมถึงเพลงนางเงือกดังกล่าว) หลังจากออกกำลังกายด้วยความช่วยเหลือของแป้นพิมพ์สิ่งที่บันทึกคอร์ดที่เหมาะสมควรเป็น เมื่อฉันลองใช้รูปแบบนี้มันให้ความรู้สึกเป็นธรรมชาติที่น่าอัศจรรย์ใจและฉันชอบวิธีการที่สามารถใช้การรุกรานทั้งสามของคอร์ดหลักและคอร์ดรอง หากต้องการเพียงแค่คอร์ดหลักและรองการปรับแต่งเช่น F-Ab-B-Eb-Gb-D ในทางทฤษฎีอาจอนุญาตให้คอร์ดหลักหกและหกนิ้วด้วยนิ้วง่าย (1-2-2-3-4-4 หรือ 1 -1-2-3-3-4) แต่ไม่มี inversions
supercat

2

390 345 340 บทความ

ประยุกต์กับแนวทางกีตาร์อย่างจริงจัง (รูปร่าง E เป็นเพียงการเปลี่ยนแปลงของรูปร่าง A เลื่อนลงสายพร้อมเปลี่ยนนิ้วเดียว) ยืมแนวคิดสตริงที่เข้ารหัสจากคำตอบอื่น ๆ

[/p{print}/x{exch}/e{cvx exec}/d{dup 0
get}/f{forall}(A0#1B2C3D5E7F8G:b;){}forall/m{dup
4 2 copy get 1 sub put}109{m 48}/+{[3 1 roll x{1
index add x}f]}/*{[0 0 2 2 2 0 0]x{load e 48 sub
+}f d 12 gt{-12 +}if d 6 gt{m -7 + 1}{0}ifelse 6
getinterval}>>begin[ARGUMENTS{*}f][(E)(A)(D)(G)(B)(e)]6{[x
e p( )p]x[x{[x e( )cvs p(---)p]}f]x()=}repeat

ก่อนหน้านี้:

450 442 418 Postscript

ฉันแก้ไขรูปแบบผลลัพธ์ด้วยอันนี้ด้วย (รุ่นก่อนหน้าเริ่ม "E ---" มากกว่า "e")

<</i{index}/a{add}/p{pop}/x{exch}/g{getinterval}/r{print}/f{forall}/e{exec}>>begin<<65[0
2 3 5 -5 -4 -2]{1 i 1 a}f p 35{1 a}98{1 sub}109{x dup
4 20 put x}>>begin[ARGUMENTS{[x[0 5 12 17 21 24 29
0]x{load e}f x{1 i a x}f]dup 0 get 0 ge{0}{1}ifelse 7
g[0 -5 -10 -15 -19 -24 -29]0 1 6{2 copy get 3 i 2 i
get a 3 copy put p p}for x p 0 6
g}f][(E)(A)(D)(G)(B)(e)]6{[x cvx e r( )r]x[x{[x cvx
e( )cvs r(---)r]}f]x(\n)r}repeat

วิธีเรียกใช้: gsnd -q -- tab.ps Bm Gb A E G D Em F\#(ซ่อนความคมชัดจากเปลือก)

รุ่นที่ไม่ตีกอล์ฟนั้นยากกว่ารุ่นที่ตีกอล์ฟ แต่ฉันพยายามอย่างละเอียด แก้ไข: ความคิดเห็นเพิ่มเติมเกี่ยวกับเคล็ดลับบิต

%!PS
<<    %axioms and operations
/t{2 2 1}    %major tetrachord
/m{t t 2}    %mixolydian mode
/u{2 1 2}    %minor tetrachord
/a{u u}      %aolian mode
/s{m m t}    %2.5-octave mixolydian intervals
/r{3 1 roll}
/${[exch 0 exch{1 index add}forall]}    %running sum: convert (relative)intervals to (abstract)fretstops
/+{[r exch{1 index add exch}forall pop]}    %scale array by scalar
/@{[r{2 copy get r pop}forall pop]}    %select array elements from array of indices
/&{0 1 3 index length 1 sub{    %array2 += array1
    2 copy get 3 index 2 index get add 3 copy put pop pop}for exch pop}
>>begin<<    %map ascii values to scaling functions
65[a]$    %generate fretstops of the A aolian scale to assign scalars to note names
[0 0 0 0 -12 -12 -12]&    %drop E F and G down an octave
{[exch/+ cvx]cvx 1 index 1 add}forall pop    %generate the pairs 'A'->{0 +}, 'B'->{2 +}
35{1 +}     %'#'-> scale up by one
98{-1 +}    %'b'-> scale down by one
109{dup 4 2 copy get 1 sub put}     %'m'-> tweak the 'third' down by one
%generate chord pattern from (string)
/*{[s]$       %generate fretstops of the E mixolydian scale
  [1 4 8 11 13 15 18]    %A-shape figured bass: IV chord of E mixolydian
  -1 +       %convert scale degrees to array indices
  @       %generate chord template by selecting indices from mixolydian scale
  exch{load exec}forall       %execute ascii values, scaling the pattern
  dup 0 get 0 ge{0}{1}ifelse 6 getinterval    %discard first note if it has fallen off the bottom
  [0 -5 -10 -15 -19 -24]&}    %subtract the string offsets
>>begin    %activate definitions
%(A)* pstack()= clear    %[0 0 2 2 2 0]
%(B)* pstack()= clear    %[2 2 4 4 4 2]
%(F#)* pstack()= clear    %[2 4 4 3 2 2]
%(Abm)* pstack()=    %[4 6 6 4 4 4]
[ARGUMENTS{*}forall]    %convert array of strings to array of patterns
[(E)(A)(D)(G)(B)(e)]    %array of string names
6{    %for each "string"
    [exch cvx exec print( )print]    %pop string name and print with space
    exch       %put names behind numbers
    [exch{     %for each "chord"
        [exch cvx exec( )cvs print(---)print]    %pop number, convert, print with trailing hyphens
    }forall]    %zip up chord array for next iteration
    ()=         %print a newline
    exch        %put numbers behind names
}repeat

แล้วเฮาส์ออฟเดอะไรซิงซันจะเป็นอย่างไร?

04:51 PM:~ 0> gsnd -q -- tabb.ps Em G A C Em G B B Em G A C Em B Em B|sed 's/^/    /'
e 0---3---0---3---0---3---2---2---0---3---0---3---0---2---0---2---
B 0---3---2---5---0---3---4---4---0---3---2---5---0---4---0---4---
G 0---4---2---5---0---4---4---4---0---4---2---5---0---4---0---4---
D 2---5---2---5---2---5---4---4---2---5---2---5---2---4---2---4---
A 2---5---0---3---2---5---2---2---2---5---0---3---2---2---2---2---
E 0---3---0---3---0---3---2---2---0---3---0---3---0---2---0---2---

ฉันเขียนความเห็นของรหัสนี้ในคำตอบที่นี่อีก
luser droog
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.