I write $X(N)$ for (the compactification of) the quotient $$\mathbb{H}\ / \ \text{PSL}(2,N).$$ For instance, $X(1)=\mathbb{P}^1$ is the compactification of $\mathbb{H}\ / \text{SL}(2,\mathbb{Z})$ and its function field is $\mathbb{C}(j(\tau))$; generated by the $j$-function.
It turns out that the function field of the other modular curves $X(N)$ are $$\mathbb{C}(j(\tau),\ f_{1/N,0/N}(\tau) , \cdots , \ \ f_{N/N,N-1/N}(\tau) ) $$ where $f_{\alpha,\beta}$ are the Fricke functions associated to the $N$-torsion points: $$f_{\alpha,\beta}(\tau) \ = \ \frac{g_2(\tau)g_3(\tau)}{\Delta ( \tau)}\wp\left( \alpha+\beta \tau , \ \tau\right).$$
(It's actually easy to show this: just show that they're $\text{SL}(2,N)$-invariant, then that $\text{SL}(2,\mathbb{Z})$ acts on them by $$f_{(\alpha,\beta)}(A\tau)\ = \ f_{(\alpha,\beta)A}(\tau)$$ which gives an injection of $\text{PSL}(2,\mathbb{Z}/N)$ into the Galois group of this field over $\mathbb{C}(j(\tau))$.) $$\text{}$$
The question: Is there a better way to show that the action of $\text{SL}(2,\mathbb{Z})$ on the Fricke functions looks like this, perhaps by computing the function field of $X(N)$ in a different way? The computation in parentheses is easy but is annoying enough to wish for a slicker proof. Similarly, is there a better way of showing that the automorphisms of $\mathbb{C}(X(N))$ over $\mathbb{C}(j(\tau))$ is $\text{PSL}(2,\mathbb{Z}/N)$?