Record des leçons de l'enfer imposées aux étudiants débutants en Python

**【Personnage】 M: (= Mentor = I à Kyoto) Pouvez-vous le voir depuis Tokyo? Q: (= étudiant de Tokyo = diplômé d'un cours d'initiation à Python) **

print("Regardé")

Regardé

M: Python a beaucoup de vidéos de leçons et de livres de référence, mais si vous trébuchez un peu, vous ne pouvez pas avancer (il y en a), donc c'est bien de les utiliser, mais je me demande si vous devriez utiliser cet endroit ensemble.

**Narration: Il s'agit d'un enregistrement de leçons individuelles sur l'enfer de la programmation Python menées à l'aide des capacités de partage de Google colaboratory. Le but est essentiellement d'apprendre la programmation, mais en tant qu'histoire, un caca profond sur l'échelle musicale et les accords est développé. ** **

M: Exemple: Pouvez-vous dessiner un graphique de y = sin (x) (0 ≤ x ≤ 4π)?

C'est une tâche non essentielle, alors je vais la diviser. (Comme une méthode)

import numpy as np
#numpy est une bibliothèque de calcul numérique qui est un peu plus intelligente que les mathématiques, et peut même effectuer des opérations matricielles.
#Comme numpy est un nom long, nous utiliserons np pour plus de facilité d'utilisation.
import matplotlib.pyplot as plt
#Comme ita n'est pas inclus dans colab depuis le début, j'utilise une bibliothèque graphique appelée matplotlib.

x = np.arange(0, 4 * np.pi, 0.1)  #De 0 à 4π 0.Obtenez des données en une étape (comme un tableau).
y = np.sin(x)
plt.plot(x, y)

output_7_1.png

# Q:
print(x)
[ 0.   0.1  0.2  0.3  0.4  0.5  0.6  0.7  0.8  0.9  1.   1.1  1.2  1.3
  1.4  1.5  1.6  1.7  1.8  1.9  2.   2.1  2.2  2.3  2.4  2.5  2.6  2.7
  2.8  2.9  3.   3.1  3.2  3.3  3.4  3.5  3.6  3.7  3.8  3.9  4.   4.1
  4.2  4.3  4.4  4.5  4.6  4.7  4.8  4.9  5.   5.1  5.2  5.3  5.4  5.5
  5.6  5.7  5.8  5.9  6.   6.1  6.2  6.3  6.4  6.5  6.6  6.7  6.8  6.9
  7.   7.1  7.2  7.3  7.4  7.5  7.6  7.7  7.8  7.9  8.   8.1  8.2  8.3
  8.4  8.5  8.6  8.7  8.8  8.9  9.   9.1  9.2  9.3  9.4  9.5  9.6  9.7
  9.8  9.9 10.  10.1 10.2 10.3 10.4 10.5 10.6 10.7 10.8 10.9 11.  11.1
 11.2 11.3 11.4 11.5 11.6 11.7 11.8 11.9 12.  12.1 12.2 12.3 12.4 12.5]
Q: ↑ Pourquoi le graphe est-il connecté en douceur même si x est discret dans ce graphe?

M: [Answer 0001] => Bien! matplotlib.pyplot.plot () n'est pas vraiment un graphe lisse, Cela semble être une méthode pour relier les coordonnées et les coordonnées avec des lignes, c'est-à-dire dessiner un "graphique en lignes pliées". Si vous augmentez la graduation de x (comme 1), cela ressemble à ceci. ↓

 x = np.arange(0, 4 * np.pi, 1)
 y = np.sin(x)
 print(x)
 plt.plot(x, y)

kakukaku.png Q: Je vois.

M: [Issue 0001] Le graphique de la fonction sin ci-dessus Corrigeons le problème et réduisons de moitié le cycle. (Ne changez pas la zone de définition)

# Q:[Réponse 0001]
x = np.arange(0, 4 * np.pi, 0.1)
y = np.sin(2 * x)
plt.plot(x, y)

output_11_1.png

M: [Problème 0002] Ajoutons des données avec la moitié de la période et de l'amplitude au graphique original de la tâche 0001.

# Q:[Réponse 0002](Qu'est-cequel'ajoutdedonnées?Jepensequec'estunesuperposition)
x = np.arange(0, 4 * np.pi, 0.1) 
y1 = np.sin(x)
y2 = 0.5 * (np.sin(2 * x))

y = y1 + y2
plt.plot(x, y)

output_15_1.png

M: [Problème 0003] Dans le graphique original de la tâche 0001, Plusieurs périodes et amplitudes réglées sur 1 / i Ajoutons la série de données. Cependant, i est un entier de 2 à 9. Une fois que vous avez fait cela, essayez de configurer i jusqu'à 99.

# M:[Réponse 0003] ①
#Soudainement allusion
import numpy as np
import matplotlib.pyplot as plt 
x = np.arange(0, 4 * np.pi, 0.1) 
y = np.zeros(len(x)) 
#y est une série entièrement nulle de même longueur que x
#len signifie longueur
print(y) 
#Où y a 9 séries
#Vous ne devriez pas les ajouter dans l'ordre.
#(Il existe plusieurs méthodes)

for i in range(1,10):
  y_temp = (np.sin(i * x)) / i
  y += y_temp


plt.plot(x, y)
[0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0. 0.
 0. 0. 0. 0. 0. 0.]
![output_18_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/216556/a4797ca9-5a0f-e2c9-9bdb-2487cfec49b9.png)

output_17_2.png

# Q:[Réponse 0003] ②
y2 = np.zeros(len(x)) #= Ligne ajoutée plus tard
for i in range(1,100):
  y_temp = (np.sin(i * x)) / i
  y2 += y_temp

plt.plot(x, y2)

output_18_1.png

M: Hmm, merveilleux! Oh attendez une minute! ② est regrettable! Si vous n'initialisez pas y avec zéro avant la boucle, le résultat de ① sera hérité! Parce que l'amplitude est trop grande! Au fait, n'est-il pas possible de se passer de y_temp? Alors réparons seulement ②.

Et si tu peux faire ça [Problème 0004] Dans la tâche 0003②, essayons i avec seulement un nombre impair! Q: Vraiment, ② Corrigé! Vous pouvez certainement le faire sans utiliser y_temp! Je me demande si cela mènera à l'histoire de la transformation de Fourier. Je l'ai fait en physique ou en mathématiques!

# Q:[Réponse 0004]
y_0004 = np.zeros(len(x))
for i in range(1,100, 2):
  y_0004 += (np.sin(i * x)) / i

plt.plot(x, y_0004)

output_21_1.png

M: Cela mène à la physique, aux mathématiques et à la musique. Si la note fondamentale est do, la 2ème harmonique est une octave supérieure do, la 3ème harmonique est une supérieure donc, la 4ème harmonique est une 2 octave supérieure do, et la 5ème harmonique est un mi supérieur, c'est-à-dire le son constituant de l'accord do majeur. (Cependant, les valeurs autres que do sont des valeurs approximatives) De plus, si vous jouez des harmoniques à la 12ème position de frette sur une guitare, vous obtiendrez des 2ème harmoniques, et si vous êtes à la 7ème position de frette, vous obtiendrez des 3ème harmoniques, et si vous êtes à la 5ème position de frette, vous obtiendrez des 4ème harmoniques. (L'artiste fait-il quelque chose sur la 7e case?) En fait, le son de la guitare est proche de l'onde dentelée (tâche 0003), donc lorsque vous jouez normalement sur une corde ouverte, elle sonne avec des harmoniques qui sont des multiples entiers. La vague dentelée est proche de la composition harmonique de nombreux instruments de musique comme les violons et les trompettes, en plus des guitares. D'autre part, une onde rectangulaire (problème 0004), c'est-à-dire une forme d'onde avec de nombreuses harmoniques impaires, devient le son d'un instrument à tube en bois tel qu'une flûte à bec, une flûte ou un hautbois. Les formes d'onde avec des harmoniques impaires comprennent non seulement des ondes rectangulaires, mais également des ondes triangulaires. https://ja.wikipedia.org/wiki/%E4%B8%89%E8%A7%92%E6%B3%A2_(%E6%B3%A2%E5%BD%A2)
En général, une forme d'onde avec seulement des harmoniques impaires a un demi-cycle symétrique.

M: [Problème 0005] En supposant que la coordonnée x de l'écrou de guitare est 0 et que la coordonnée x du pont est 1, la coordonnée x de chaque frette est

Etc. (... Est-ce vrai?)

Le programme suivant était destiné à tracer la position de l'écrou de guitare à la 12e frette (la coordonnée y est fixée à 0), Les a et x sont calculés de manière incorrecte et les frettes sont régulièrement espacées.

① Pouvez-vous fixer la position des frettes comme la vraie chose?

(2) La méthode de jeu des harmoniques utilisée près de la 7e frette doit-elle être légèrement décalée du côté de l'écrou ou du côté du chevalet?

# M:
import numpy as np
import matplotlib.pyplot as plt
 
a = 1 / 12
n = 13
x = [1 - a * i for i in range(n)] 
y = [0] * n 
print(x)
plt.plot(x, y, "o")
[1.0, 0.9166666666666666, 0.8333333333333334, 0.75, 0.6666666666666667, 0.5833333333333334, 0.5, 0.41666666666666674, 0.33333333333333337, 0.25, 0.16666666666666674, 0.08333333333333337, 0.0]

output_24_2.png

# Q:
import numpy as np
import matplotlib.pyplot as plt
 
a = (1/2)**(1 / 12)
n = 13
x = [1 - a ** i for i in range(n)] 
y = [0] * n 
print(x)
plt.plot(x, y, "o")
[0.0, 0.05612568731830647, 0.10910128185966061, 0.1591035847462854, 0.2062994740159002, 0.25084646156165913, 0.2928932188134523, 0.3325800729149827, 0.3700394750525633, 0.40539644249863926, 0.43876897584531327, 0.4702684528203521, 0.4999999999999998]

output_25_2.png s: La 3ème harmonique est produite par x = 0,333 ... Par contre, la position de la 7ème frette est x = 0,3325 ... Par conséquent, il doit être légèrement décalé du côté du pont. M: Très bien fait! Alors pourquoi la 7e case n'est-elle pas exactement 1/3 de la longueur de la corde?

La réponse est: "Il n'y a aucune raison de faire cela."

La position de la 7e frette 1- (1/2) ** (7/12) est probablement un nombre déraisonnable (c'est-à-dire que ce n'est pas 1/3), n'est-ce pas?

Probablement pas la preuve que ce sera 1/3.

Historiquement, était-ce le temps de M. Bach? Afin de transposer librement la musique, il était nécessaire de concevoir la fréquence de l'échelle comme une séquence à rapport égal.

C'est-à-dire que le rapport des fréquences adjacentes est rendu constant. Do: Do # = Do #: Les = Les: Les # = ・ ・ ・ Ensuite, quand je divisais une octave en 12 séquences de rapport égal (c'est ce qu'on appelle la loi moyenne), j'ai remarqué qu'il y avait des hauteurs agréables à certains endroits.

Par exemple, Domiso se sent bien (en harmonie) lorsqu'il est joué ensemble. En y regardant de plus près, le rapport de fréquence de Domiso était "à peu près" de 4: 5: 6.

D'autre part, il existe également une conception de tonalité qui fait du domiso de force un rapport serré (c'est-à-dire un nombre rationnel) tel que 4: 5: 6, et cela s'appelle «ton authentique». (Les racines sont M. Pitagoras.) Cependant, dans le ton authentique, il est rarement utilisé car il est nécessaire de réaccorder lors du changement (ou de la fixation d'un capodastre).

M: [Problème 0006] Implémentons une fonction sin_wave qui génère des données d'onde sinusoïdale arbitraires en donnant à chacun la fréquence, l'amplitude, le nombre de secondes et l'intervalle de données minimum. (La fonction ici n'est pas une fonction mathématique qui trouve y à partir de x.)

# M:
import numpy as np
import matplotlib.pyplot as plt

def sin_wave(frequency, amplitude, duration, tick):
    # sine_wave:Une fonction qui génère des données d'onde sinusoïdale arbitraires
    #   frequency:la fréquence(Hz),  
    #   amplitude:amplitude(V,Autrement dit, boulon), 
    #   duration :Nombre de secondes de données, 
    #   tick     :Intervalle de données minimum(Secondes), 

    #Mettez en œuvre ici.
    # s:
    x = np.arange(0, duration, tick)
    y = amplitude * (np.sin(2 * np.pi * x * frequency))

    return x, y

x, y = sin_wave(frequency=10, amplitude=3, duration=2, tick=0.01)
plt.plot(x, y)

output_29_1.png

M: Challenge 0006 = surtout bien!

En général, les calculs qui aboutissent à des constantes doivent être retirés de la boucle. Par exemple, si vous souhaitez utiliser 2 * np.pi * x [i] * fréquence dans une boucle for qui transforme i

npf = 2 * np.pi *  frequency
for i in range(0,duration,tick):
    y[i] = amplitude * (np.sin(npf * x[i]))

Ce sera plus rapide.

Cependant, dans le cas de l'utilisation de l'opération vectorielle de numpy sans utiliser pour comme cette fois, si l'implémentation de numpy est intelligente, la vitesse peut ne pas changer beaucoup.

M: [Problème 0007] En utilisant la fonction sin_wave, tracez les trois sons constitutifs de la forme de base de l'accord majeur de A et un total de quatre séries qui les superposent dans des couleurs différentes (le paramètre de couleur de plot est respectivement "r". Faisons-le "," g "," b "," k ") et dessinons-le sur un système de coordonnées.

Cependant, le temps est de 0,02 seconde, l'intervalle de données minimum est de 1/10 000 seconde, la fréquence du son de base de A est de 220 Hz et l'amplitude des sons constitutifs est de 1 V.

Q: Je l'ai fait par intuition </ font>

# Q:
x, y1 = sin_wave(frequency=220, amplitude=1, duration=0.02, tick=0.0001)
plt.plot(x, y1, color="r")
x, y2 = sin_wave(frequency=220*2**(1/3), amplitude=1, duration=0.02, tick=0.0001)
plt.plot(x, y2, color="g")
x, y3 = sin_wave(frequency=220*2**(7/12), amplitude=1, duration=0.02, tick=0.0001)
plt.plot(x, y3, color="b")

plt.plot(x, y1+y2+y3, color="k")

output_34_1.png

M: Je vois, c'est une fourmi. ・ ・ Est-ce une règle moyenne? (C'est vrai w) Je ne savais pas que (2 \ * \ * (1/12)) \ * \ * 4 deviendrait 2 \ * \ * (1/3) ... (explosion de la littérature) L'exemple de solution suivant est lorsque vous devez économiser de la mémoire. Pour référence, légèrement.

# M:Exemple de réponse
plt.figure(figsize=(40, 10), dpi=72)
root = 2 ** (1 / 12)
for i, s in enumerate([[0, "r"], [4, "g"], [7, "b"]]):
    x, y = sin_wave(220 * (root ** s[0]), 1, 0.05, 0.0001)
    plt.plot(x, y, color=s[1], lw=2)
    y_sum = y if i == 0 else y_sum + y
plt.plot(x, y_sum, color="k", lw=5)
plt.plot([0, 0.05], [0, 0], color="k")

output_36_1.png

M: [Problème 0008] Au fait, la tâche 0007 était une règle moyenne, mais que faire si elle est authentique? Comme c'est un gros problème, pourquoi ne pas l'essayer en vous basant sur l'exemple de réponse ci-dessus? Essayez également de dessiner l'axe des x (ligne de y = 0).

# Q:
plt.figure(figsize=(40, 10), dpi=72)
for i, s in enumerate([[1, "r"], [1.25, "g"], [1.5, "b"]]):
    x, y = sin_wave(220 * (s[0]), 1, 0.05, 0.0001)
    plt.plot(x, y, color=s[1], lw=2)
    y_sum = y if i == 0 else y_sum + y
plt.plot(x, y_sum, color="k", lw=5)
#y = [0] * len(x)
#plt.plot(x, y, color="k")
plt.plot([0, 0.05], [0, 0], color="k")

output_38_1.png

M: J'ai changé la taille d'affichage des deux graphiques ci-dessus. (Cela peut être plus facile à comprendre si vous le regardez sur un PC)

Vous pouvez voir qu'il y a deux points où chaque série se croise exactement à y = 0 dans le style authentique ci-dessous.

De plus, bien que ce soit l'axe des x, je ne dessine qu'une seule ligne, donc je n'ai utilisé que deux coordonnées pour économiser de la mémoire. (J'aurais aimé qu'il y ait une méthode pour dessiner l'axe des x en premier lieu, mais je ne l'ai pas encore confirmé)

Donc, je pense qu'il n'est pas important de faire un passage par zéro, mais que la forme d'onde synthétisée répète le même motif dans un cycle court.

Lorsque j'ai prolongé le temps à 0,05 seconde, ce dernier ton authentique a répété exactement le même schéma, tandis que l'ancien règle de la moyenne. Le schéma semble changer progressivement.

(La même forme d'onde se répète lorsque le temps atteint le multiple commun minimum du cycle.)

Eh bien, le sujet tant attendu de l'octave. Pourquoi avez-vous décidé de concevoir une échelle de tons qui a un intervalle d'une octave et une séquence de fréquences égales entre elles? Pour le dire autrement, par exemple, ne devrions-nous pas diviser les deux octaves en sept échelles? De plus, ne devrions-nous pas faire une échelle avec des nombres de fréquences «à différence égale» entre 1Hz et 1KHz, par exemple? Il a une relation entre le ton et la hauteur. Comme on le voit dans les ondes dentelées, les sons musicaux autres que les ondes sinusoïdales (sons avec hauteur de ton) contiennent généralement des «harmoniques» qui sont des multiples entiers du ton de base, et ceux-ci forment des «sons». La hauteur la plus basse de cet harmonique est généralement deux fois la fréquence, c'est-à-dire une octave plus haut. Ainsi, dans la tâche 0002, le "ton" a été ajusté en synthétisant le son de base et l'onde sinusoïdale une octave plus haut. Si vous augmentez davantage le rapport de ce son plus élevé, il se rapprochera progressivement du son une octave plus haut. En d'autres termes, au lieu d'augmenter progressivement la fréquence, comme de faire à ré, en modifiant le rapport des harmoniques, le son devient une octave plus haut avant que vous ne le sachiez. En d'autres termes, un son avec une différence d'octave peut être considéré comme un son avec une tonalité différente (même hauteur d'origine). Par exemple, au karaoké, une voix féminine et une voix masculine jouant la même mélodie avec des octaves différentes peuvent être considérées comme chantant à la même hauteur bien que le ton soit différent. De cette façon, les sons avec des octaves différentes ont "à l'origine la même hauteur", de sorte que le concept d'une octave ne peut pas être exclu de la conception de la gamme. Est-ce une explication? (Eh bien, comment expliquer les harmoniques impaires d'une onde rectangulaire? Eh bien, la hauteur de "so" pour "do" ne peut pas être supprimée ...)

** Une fois complété **

Recommended Posts

Record des leçons de l'enfer imposées aux étudiants débutants en Python
Un enregistrement de patcher un package python
Un mémo qui a fait un tutoriel pour exécuter python sur heroku
Environnement enregistré pour l'analyse des données avec Python
Un mémorandum où je suis tombé sur mon HEROKU & Python personnel (Flask)
Manipulation de python sur mac
AtCoder Beginner Contest 169 Explication du problème "Multiplication 1" (Python3, C ++, Java)
AtCoder Beginner Contest 176 A Explication du problème "Takoyaki" (Python3, C ++, Java)
[Windows] L'histoire d'un débutant qui tombe sur le décor de PATH d'Anaconda.
J'ai fait beaucoup de recherches sur la façon dont Python est exécuté
Obtenez le nombre de lecteurs d'articles sur Mendeley en Python
Construire un environnement Python sur Mac
Une bonne description des décorateurs Python
[Python] Un mémorandum de belle soupe4
Créer un environnement Python sur Mac (2017/4)
Un bref résumé de la collection Python
Créer un environnement python dans centos
Construire un environnement pour python3.8 sur Mac
Créer un environnement python3 sur CentOS7
Enregistrement de l'introduction de Python pour les nouveaux arrivants
L'histoire d'un débutant en apprentissage profond essayant de classer les guitares avec CNN
Exécuter un lot de Python 2.7 avec nohup sur Amazon Linux AMI sur EC2
Construire un environnement python sur MacOS (Catallina)
Afficher une liste d'alphabets en Python 3
Créer un diagramme de relations des modules Python
Carte des informations de location sur une carte avec python
Connectez beaucoup de Python ou et et
[python] Obtenir une liste de variables d'instance
[python] [meta] Le type de python est-il un type?
Un peu plus de détails sur la notation d'inclusion de python
Pandas du débutant, par le débutant, pour le débutant [Python]
Étude sur Tokyo Rent en utilisant Python (3-1 sur 3)
Exécutez le code Python sur A2019 Community Edition
Créer un environnement Python + OpenCV sur Cloud9
L'histoire du traitement A du blackjack (python)
[Python] Localisation japonaise de matplotlib sur Ubuntu
[Python] Une barre de progression sur le terminal
[Python] Obtenir une liste de dossiers uniquement
Mémorandum du processus de suppression de chaîne python
Installez séparément une version de Python qui n'est pas préinstallée sur votre Mac
J'ai fait un script pour enregistrer la fenêtre active en utilisant win32gui de Python
[Python] Tracer les données par préfecture sur une carte (nombre de voitures possédées dans tout le pays)