Your Oscilloscope has ExPloDEd ! Make a sine wave [ CODE GOLF]

BAM! - Fire and Smoke
Your Oscilloscope has exploded from one too many waves.

Re-create these waves assuming the following:

All waves are Sine Waves

An amplitude of 1 spans 3 lines (Therefore and amplitude of 2 would span 5 lines) [Vertically]

We want to see 100 characters worth of sine (Can be any char) [Horizontally]

12 characters per Period is a frequency of 1Hz


[Amplitude of 1 and Frequency of 1Hz with a Span of 45 Characters]
&gt;SinASCII('a1','f1')

   ...         ...         ...             &gt;            
...   ...   ...   ...   ...   ...   ...    &gt;[cont. for 100 char] 
         ...         ...         ...       &gt;


Inputs
Inputs can be in any format but must be explicitly stated if different from standard (below) and must contain:

Amplitude
Frequency

Test inputs:  [('a2', 'f0.5'), ('a4', 'f1'), ('a6', 'f2'), ('a1','f0.25')]

This is a CODE GOLF Challenge
Some Clarification
Because sine is a continuous function, the values must be discretized:
For the case of amplitude of 1 and frequency of 1Hz the &quot;Crest&quot; of the sine wave must be on line 1 and the &quot;Trough&quot; of the sine wave must be on line 3.
To achieve the intermediate points, the wave points are set corresponding to ranges associated to the sections of the wave and these ranges will be relative to the amplitude.
Wikipedia - Crest and Trough
Python 3, 128 \$\cdots\$ 107 103 bytes

Added a byte to fix and error kindly pointed out by blueteeth.
Saved 23 27 bytes thanks to Jonathan Allan!!!
Added a byte to fix a fudge kindly pointed out by Jonathan Allan.   



lambda a,f:[[' .'[~j&lt;=a*sin(f*i*pi/6)+.5&lt;-j]for i in range(100)]for j in range(~a,a)]
from math import*


Try it online!

Inputs an integral amplitude and a float for frequency.
Uses a period of 12 characters for 1Hz.
Returns a list of lists of characters.