This is a kind of follow-up to this question. The last answer is almost perfect, but the frequency on the keyboard is wrong. For example, C1 should be 32.703, not 32.696. I can't find the error, the formula is correct. Can someone help please ?
Asked
Active
Viewed 2,725 times
4
1 Answers
11
Using expl3 to calculate the frequencies (the rest of this answer is shamelessly copied from the answer linked in this question):
\documentclass[border=0.25cm]{standalone}
\usepackage{xparse}
\usepackage{tikz}
\usepackage{musixtex}
\ExplSyntaxOn
\NewExpandableDocumentCommand \myFrequencyCalculation { m }
{ \fp_to_decimal:n { round(2**((#1-49)/12)*440,3) } }
\ExplSyntaxOff
\begin{document}
\pgfdeclarelayer{blacknotes}
\pgfsetlayers{main,blacknotes}
\tikzset{tight fit/.style={inner sep=0pt, outer sep=0pt}}
\begin{tikzpicture}
\def\lastnotenodename{clefs}
\node [text width=1cm, tight fit] (clefs) at (0,0) {
\begin{music}
\instrumentnumber{1}
\instrumentnumber{2}
\nostartrule
\setstaffs1{1}
\setstaffs2{1}
\setclef1{\bass}
\setclef2{\treble}
\startextract
\hskip2.0\elemskip
\zendextract
\end{music}
};
\foreach \note [
evaluate={
\n=int(mod(\note-1, 12));
\octave=int((\note+8)/12);
\t=int(floor((\note-1)/12)*7-7);
\notename={"A","","B","C","","D","","E","F","","G",""}[\n];
\tonicsolfa={"la","","si","so","","r\`e","","mi","fa","","sol",""}[\n];
\blacknote={0,1,0,0,1,0,1,0,0,1,0,1}[\n];
\frequency={\myFrequencyCalculation{\note}};}
] in {1,...,88}{
\ifnum\octave>3
\tikzset{extract anchor/.style={anchor=south west, at=(\lastnotenodename.south east)}}
\else
\tikzset{extract anchor/.style={anchor=north west, at=(\lastnotenodename.north east)}}
\fi
\ifnum\blacknote=0
\edef\notenodename{\notename_\octave}
\node (\notenodename) [tight fit,text width=1cm, extract anchor/.try] {%
\begin{music}
\instrumentnumber{1}
\instrumentnumber{2}
\nostartrule
\setstaffs1{1}
\setstaffs2{1}
\setclefsymbol1{\empty}
\setclefsymbol2{\empty}
\setclef1{\bass}
\setclef2{\treble}
\startextract
\transpose\t
\hskip-1.5\elemskip
\ifnum\octave>3
\ifnum\octave>4
\Notes \nextinstrument \ql{\notename} \en
\else
\Notes \nextinstrument \qu{\notename} \en
\fi
\else
\ifnum\octave>2
\Notes \ql{\notename} \en
\else
\Notes \qu{\notename} \en
\fi
\fi
\zendextract
\end{music}
};
\xdef\lastnotenodename{\notenodename}
\node [anchor=base] (sol-fa) at (\notenodename |- 0,-3) {\tonicsolfa$_\octave$};
\draw (\notenodename.south west |- 0,-4) rectangle ++(1, -4);
\node [rotate=90, font=\footnotesize, anchor=east]
at (\notenodename.north |- 0,-4) {\frequency};
\node [font=\footnotesize, anchor=south]
at (\notenodename.south |- 0,-8) {\note};
\node [font=\footnotesize, anchor=south]
at (\notenodename.south |- 0,-8.5) {\notename$_\octave$};
\draw (\notenodename.south west |- sol-fa.south)
rectangle (\notenodename.south east |- 0,1.125); %0.125 by trial and error
\else
\begin{pgfonlayer}{blacknotes}
\fill ([xshift=-0.25cm]\lastnotenodename.north east |- 0,-4) rectangle ++(0.5, -2.5);
\node [rotate=90, text=white, font=\footnotesize, anchor=east]
at (\lastnotenodename.north east |- 0,-4) {\frequency};
\end{pgfonlayer}
\fi
}
\node [rotate=90] at (0,-6) {Fr\`equency (Hz)};
\end{tikzpicture}
\end{document}
Joseph Wright
- 259,911
- 34
- 706
- 1,036
Skillmon
- 60,462
-
1It is an excellent answer (I upvoted it) but the piano keyboard is not absolutely correctly drawn. It may seem a minor point, but there is a lot of history and music theory behind the layout of the keyboard. This is a common thing, so common it is practically impossible to find an illustration that is correct. Almost all diagrams show black keys equally bisected by by their neighboring white keys. In fact this is true only for G-sharp. I wish I could post a diagram -- I've worked it out with TikZ, and a very informative project it was. Still, excellent answer! – sgmoye Aug 28 '18 at 18:20
-
You can use the document-level
\fpevalfunction fromxfprather than needing to go to theexpl3layer – Joseph Wright Aug 29 '18 at 07:01 -
@JosephWright I don't see the advantage of a wrapper here (the CPU cost of the document is high already, why increase it with it?). – Skillmon Aug 29 '18 at 07:28
-
@Skillmon Avoids needing
\ExplSyntaxOn, etc. in the document. There's no significant hit over the current code: the number of expansions only goes up a tiny amount. – Joseph Wright Aug 29 '18 at 07:44 -
@Skillmonlikestopanswers.xyz I am a complete beginner of TikZ and I want to draw a plain piano without it's range. I am trying to learn how you have coded it, but everything is tightly nested. Can you explain how to have a plain piano template without any other stuff on it with the help of this code? – Niranjan Feb 04 '20 at 12:14
-
@Niranjan you should ask a new question on the site. Reference this question and the question linked to in the OP. – Skillmon Feb 04 '20 at 12:19
-
@sgmoye I found a nice article that looks into the details of black key spacing. – Petr Oct 10 '20 at 10:06

expl3floating point unit and it indeed gets the correct value (I did so before you posted that link...). The source is indeed the maths implementation of pgf, which doesn't have the same precision asexpl3's. – Skillmon Aug 28 '18 at 13:592**((4-49)/12)is0.07432544468767006. This times440is32.70319566257483. But if you apply a precision of 5 digits after the decimal marker you get0.0743*440 = 32.692. – Skillmon Aug 28 '18 at 14:05tikzdecided that "nobody will ever need more than 5 decimal places (of an inch?) for drawing pictures," I suppose! – alephzero Aug 28 '18 at 14:25sp(which is so small that no human eye can see a difference). TeX's calculation wasn't meant for scientific calculus. – Skillmon Aug 28 '18 at 14:28