如下描述集中在本发明对于扬声器的应用上。然而,本发明不限于这样的用途,并且可以应用于其他声传输和复制器件,如在说明书未尾叙述的那些。
现在参照附图,其中类似标号在所有图中指示类似或相应部分,并且具体地对于图1,表示有一种包括本发明的系统10。系统10包括一个信号源12,用来提供电气声频信号。信号源可以是例如一个CD唱机。来自信号源12的输出14输入到一个采用本发明的详细特征和方面的补偿系统16。输出14由补偿系统16处理,以产生一个供给到一个功率放大器19和一个扬声器20的补偿电气声频信号18。
参照图2,补偿系统18采用多个滤波器24,滤波器24或者个别地或者组合地呈现模拟由扬声器的各种机械、声学和电磁元件呈现的频率、时间和相位响应的个别补偿响应。与滤波器24的每一个,并因而与补偿响应的每一个,相联系的是一个或多个可调节参数22。使用DSP或模拟
电路创建滤波器24。数字信号处理是最佳实施,因为扬声器性能的分析模型容易转换到用于设计数字系统的数学综合技术。模拟电路具有建立在级联结构中的失真。因此,仅当模拟设计者知道在性能响应是隔离和无相互作用时使用并联连接电路元件时,补偿系统18的实际模拟实施才是可能的。一些参数22调节与补偿系统的一个或多个部分相互作用。一种数字实施提供利用可能设置的编辑或按需要计算这些关系的能力。当由计算机控制补偿系统时,建立调节显得简单和直观。
这些计算和可调节补偿响应的每一个能定标到尤其与尺寸、运动性质或声学辐射性能有关的参量变量、特征、或设计方面。能调节扬声器的时间延迟、最大漂移极限、波长关系、节点和驻波频率、边界反射及类似性质,并且由补偿系统使用。代替编辑或减小扬声器元件以创建一个集总响应系统,补偿系统使用最小相位均衡和无相互作用滤波器串。
对于小扬声器的典型整体响应表示在图3f中。在图4的顶部处重复相同的响应。图3a-3e表示与结合产生整体响应曲线的扬声器元件有关的多个个别响应。图4a-4e表示经多个可调节参数,例如LS、HS、LX、HX等,调节以产生多个共轭响应的多个个别补偿响应。下面详细描述参数的性质。如图4f中所示,个别共轭响应组合以产生或一个整体共轭响应。整体扬声器响应(图3f)和共轭响应(图4f)的组合产生一个平稳响应。
由图3a和4a,对于高和低频的第一和第二截止反射是显然的。在曲线上的这些点确定用于LX、LS、HX、和HS的频率。当音圈长度和运动互补能力已知时,那么类似于图5中表示的一种的计算或图表能帮助确定用于LP的合理频率和振幅。以类似的方式处理HP。有关的反射、截止、和频率表示在图3b和4b中。LP和HP的振幅设置具有主观功率处理和加权补偿问题。
在其外壳体中操作的驱动器的自谐振能测量或计算以产生W0。由传统模型能试验地测量和计算有关的Q0和|A|0设置,条件是已经除去声学耦合因数。图3d和4d表示这种低音补偿。
在常规模型中很少使用机械谐振的表示,象W1。图3d和4d的高频部分表示,来自W1的声学响应误差和着色能由设置|A|1除去。注意周
围谐振,并且能选择预置或缺省Q,以补偿象征着涉及的扬声器材料的谐振性能模型。
节点和干扰性能在图3e中是显然的。在图6中的其他例子揭示节点跳跃、干扰、及因为粗糙、污染声音的常常叫做“锥叫(cone cry)”的相关问题。与表示在图7中的那些类似的瀑布或MLSSA能表示象征这样的高能量运动干扰的频率和延迟分散结果。图4e中的隐藏补偿切口WCC1和WCC2除去这些频率和能量存储问题。
添加斜坡或倾斜EQ以实现最好的听众喜好。图3c和4c表示性能和校正。为了主观平衡可以添加辅助向下倾斜。
如能看到的那样,每个横跨少到8位分辨率的近似12至16次调节能进行非常良好的共轭校正。来自两个扬声器驱动器单元的代表性频率响应表示在图6中。注意,如由在低端处的响应曲线的滑离指示的那样,与LP有关的W0和第二反射响应丢失,因为驱动器在非常大的壳体中操作。除此之外,其它的参量相关特征是显然的,并且由这些曲线能算出调节。
如下参数允许扬声器的复合频率、相位、及时间响应的创建、模拟或与其共轭。这些可调节参数22和其操作能近似零相位响应,扩展低音输出,及从扬声器除去机械声音(能以类似方式使用其他参数)。使用有源或无源模拟电路,如RC电路、模拟谐振器、或象状态变量滤波器或双石英片之类的全参量电路,能数字地进行个别补偿。
术语 |
缩写 |
描述、关系 |
低交叉 |
LX |
辐射面积、柔性、空气体积、声学耦合、及BL因数。(第一反射@+/-6dB每八度) |
高交叉 |
HX |
质量、辐射面积关系、刚度、BL因数。(在每八度@+/-6dB下的第一反射) |
低提升搁置 |
LS |
设计极限、声平衡、(XdB停止斜率) |
高提升搁置 |
HS |
设计极限、功率处理、有用的响应线性(XdB停止斜率) |
低波峰 |
WL |
用于第二耦合反射的提升。用于高通或低频极限滤波器的隐藏补偿。(缺省截止斜率、XdB波峰) |
高波峰 |
WH |
用于第二高频损失的提升。用于低通或高频极限滤波器的隐藏补偿。(缺省截止斜率、XdB波峰) |
电机 |
BL |
力、反电动势、电感因数。调制响应和参量值的影响 |
低音谐振 |
W0 |
音量、柔性、面积、阻尼、BL因数。(频率、Q、振幅) |
术语 |
缩写 |
描述、关系 |
端口调谐 |
WB |
低音调模型(传统的)(用于双调谐滤波器模型的输入) |
机械谐振 |
W1、W2、至Wn |
系统的部分包括板、锥、周围场、及圆顶(频率、Q、和振幅) |
稳定谐振 |
WCC1、WCC2、至WCCn |
节点模式:驻波、钟形模式、延迟耦合干扰(加权切口频率、Q及振幅) |
耦合因数 |
|A|1、|A|1…|A|n |
谐振数值(谐振器的总是可调节的部分+/-dB) |
损耗因子 |
Q0,Q1…Qn |
谐振带宽(缺省或调节可能+/-dB) |
倾斜 |
dB |
离开频率平衡输出:BL因数。主观平衡和缺省放置平衡 |
波干扰 |
Td |
尺寸:壳体、地板、壁、扬声器和听众放置。 |
平衡 |
EQ |
用户操作的:房间、其他传统的 |
功率 |
PW |
最大低频输入或输出。模拟比例或阈值开关探测器 |
模式开关 |
SW1、SW2、等 |
动态过程:操作或选择 |
在8与32参数调节之间的某处可以用来编程补偿系统和操作一个适当的补偿过程。由于参数与专用物理和性能方面有关,所以对于调节范围和精度的数据要求远小于覆盖人类感觉所需要的。八位分辨率对于这些的多数是适当的,从而一个1-5k位的单次数据流特征化来自模型的一个非常复杂的响应。以上参数的描述如下。
低交叉(LX)或声学耦合-低频输出取决于辐射表面的尺寸。来自这种关系的每八度6dB损失由增大的锥运动固有地补偿,条件是来自电机结构的反电压与驱动信号相比较小。如果柔性是无限的并且电机产生力而没有速度限制,则这种理想化的配置具有平响应。具有空气体积、机械刚度、及速度极限的真实系统具有两个实际交叉点,其中响应从平的中止,并且会聚到6dB/八度和然后到12dB/八度低音损失。通常,第二反射靠近扬声器的最低有用响应,并且常常成为不实际地补偿。用于这种补偿的控制参数是单位为Hz的频率,并且共轭响应(特定补偿)对于减小频率是+6dB/八度提升。这种提升在来自扬声器的第一响应反射处开始。用于该参数的值能通过向扬声器施加一个试验信号,例如正弦波,和测量响应而测量。根据扬声器的物理特性,如锥和线圈质量,也可以计算该值。由扬声器模型,如一般由扬声器制造商提供的标准Theil/Small模型,也可以导出该值。
高交叉(HS)或质量柔性因数-高频输出取决于辐射表面的尺寸和速度。通常,用于靠近截止的频率的感兴趣波长与创建输出的扬声器的运动相
比较小。锥材料的刚度和阻尼性质影响以较低频率来自整个表面的辐射的这种过渡。频率辐射越高,越靠近音圈。运动质量最终借助于增大频率创建运动的6dB/八度减小。来自电机组件的漏电感把另外的柔性添加到系统上,以在最高实际频率下创建进行12dB/八度下降的第二反射。这些损失与减小的辐射面积相结合,创建声学输出的减小。在较低频率下,能熟练地平衡两种关系以产生平声学响应。用于这种补偿的控制参数是单位为Hz的频率,并且共轭响应是具有增大频率的6dB/八度提升。以与对于低交叉在以上描述的相类似的方式能测量或计算用于该参数的值。
低提升搁置(LS)-来自LS的最大提升限制到来自放大器功率、锥运动、音圈长度、壳体尺寸、及打算低音扩展的实际最大极限。这些要求矛盾和相互作用,例如音圈要求越长,放大器和悬挂部分越大。例如,一个延长的线圈能提供较大的线性漂移和低音输出潜力,但效率减小,除非增大来自磁铁的磁通能量。增大漂移要求较大的周围场,并且必须增大锥直径以保持相同的辐射面积和低音输出。低音谐振越低,而扬声器必须物理上越大,并且增大的运动质量进一步减小效率。如果限制放大器功率,则壳体变得较大。LX、W0(下面描述)和LS参数的操纵使有效或扩展响应扬声器设计具有小得多的折衷。另外,能使LS参数改变或跟踪不同的音量控制设置和程序动态,从而扬声器系统能靠近其最大能力在宽范围条件下操作。LS参数受设计和结构因数的影响,这些因数包括辐射面积、柔性、及驱动电机的力因数。模型化参数能以非常小的相互作用能跟踪变化至这些因数。LS参数是+/-dB。LS参数设置能经试验测量通过具有折衷权衡的试验确定。
高提升搁置(HS)-扬声器的实际最大性能和功率处理能力限制最大高频
率提升。在某些用途中,可以把HS参数设置成减小来自源的感觉失真代之以来自扬声器。关于LS,通过命令能使内部操作设置变化。当系统的其它部分,包括程序材料,按压成在其最大线性功率能力上方操作时,这种特征能帮助覆盖增大失真。HS参数是+/-dB。其设置最好经试验测量试验地确定。
低波峰(WL)-谐振低音截止常常是希望的。为此平衡记录,并且把大多数扬声器设计成具有自谐振低音增强。一般,较大扬声器具有较低谐振频率,并且听众把值联系到这种关系上。WL参数提供在扬声器本身的自然自谐振(W0)下面的低频谐振提升。当低QL补偿响应下降除去W0效应时,扬声器系统就象它较大那样电气和声学地动作。它不会具有平衡小扬声器的隆隆或箱声音。为了防止过分失真和功率抽取,在WL下面的信号迅速衰减,并且涉及的高通滤波器跟踪WL参数设置。这种作用具有与加权补偿类似的主观因数,因为在截止下面的频率可能弱小,但当不由在人类听觉的WL临界频带中的其他声音掩蔽时仍能听到。一般,调节和设置WL波峰,以便对于最大回放条件控制功率和失真。对于其他条件,能关闭高通或次低音滤波器,并且运动或改变低通滤波器的(LP)的部分而没有明显的主观结果。如描述的那样,能动态地调制WL参数以扩展低音或减小失真。低通滤波器的响应的调节包括波峰频率(WL)和单位为dB的振幅|AL|。意味着缺省QL设置。
高波峰(WH)-谐振截止可能是希望的以补偿第二截止反射,或者它能用来限制复制带宽。第一用途能扩展响应和减小群延迟失真。带宽限制可能是需要的以使失真程序声音较好。波峰谐振器跟踪高通滤波器(HP)以与低频波峰系统相类似的方式操作。高通滤波器能排列成创建加权响应限制和提供在临时设计实践中最佳的波峰截止响应。高通滤波器调节包
括单位为Hz的波峰频率(WH)和单位为dB的振幅(|AH|)。意味着缺省QH设置。
电机(BL)磁铁结构和音圈的性质统一到传统表示。音圈直径、绕组长度、间隙磁通、磁极尺寸等是创建电机和发电机当量的传统扬声器模型的部分。关于电流和机械运动、以及其他与机械性质有关的因数的力和反EMF关系得到简化表示。有时包括漏电感和机械质量关系。这些元件由各种装置测量、计算或导出,以创建能影响扬声器多个性能方面的一组电机相关参数。对于补偿系统和其处理的可调节参数取决于BL。因此,如果需要,模型能具有建立的关系,从而BL变化能调制参数设置。例如,BL特性能用来跟踪或重新调节用于具有不同磁铁重量、音圈长度、或其它机电因数的类似扬声器的其它参数。可调节BL参数能是:磁通x长度、电压x速度、波峰漂移长度、及电阻/电感或时间常数。
低音谐振(WO)或自谐振-这是扬声器的自然低音谐振频率。其值由空气体积、机械柔性、辐射面积、阻尼、运动质量、电机特性、及扬声器的其他设计特征确定。不象传统低音模型,声学耦合因数不是W0响应的部分,因为它在补偿系统的LX参数中已经描述。这种布置防止在调节参数之间的相互作用,并且对于机械性能的等效转换到机械性能的LCR谐振器等效。频率W0、Q0和耦合能量或振幅|A0|的用户命令语言能规定对于机械谐振性能的共轭响应。因为用于系统的扬声器性能和校正响应具有相同的量极、但相反的振幅,所以群延迟性能能非常良好。调节是单位为Hz的W0,Q0作为一个数,及单位为dB的|A0|。这些调节值能由非常近范围设备、位置检测换能器;或由计算试验地确定。
端口调谐(WB)-多个扬声器设计成提供一种打算扩展频率响应或改进功率处理的第二低音谐振。这样作的物理结构包括端口、管、无源谐振器、
迷宫、其它低音喇叭等。许多文献已经致力于模型化和调谐这些系统,通常实现最平的可能频率响应。这样的模型与补偿系统相结合,有潜力扩展低音、改进过渡响应、及改进效率而不增加扬声器的成本。能结构设计较大功率处理和扩展低音能力,并且通过共轭校正能除去由使用这种策略生成的频率响应奇异性和端带失真折衷。当进行这种选择时,端口能较大并且调谐较低、使壳体较小、以及改进低音的其他变化。粗响应和次低音过载的生成结果由补偿系统颠倒。标志或开关能是控制操作的部分,这种控制操作辨别程序条件或在扬声器处的响应状态。来自样本或试验的极限状态确定用于该前馈/反馈型系统的开关状态。然后,从开关或状态输入选择参数系数。以这种方式,补偿系统能借助于模糊逻辑控制或其它方法操作,以防止对于参数值的不必要肘动(toggling)或变化。例如,不同的音量控制设置、程序水平、或低音内容能改变参数系数和排列,以实现较高功率或较平响应优化。开关操作可能是可听的,但控制磁滞提供较不明显或客观的策略变化。便宜设备是希望的,并且可能过载或超越合理线性操作推动。以适当控制逻辑操作的补偿系统能致动柔和及响亮的操作状态,每种状态具有最优排列,而不创建其之间的失真连续。
机械谐振(W1、W2、至Wn)-扬声器系统的多个部分和动作象谐振器起作用。不象W0,这些的大多数是无意的,并且他们通常添加到扬声器的声学输出上。这些尤其包括圆顶、锥、及周围场的弯曲和质量性能、以及机箱共振。等效LCR性能参量化成无相互作用的个别校正或与用于W0的那些相类似的调节。谐振调节是单位为Hz的W1、W2、至Wn;单位的Q1、Q2、至Qn(下面描述);及单位为+/-dB的|A1|、|A2|至|An|(下面描述)。显得类似于房间响应的小、低Q谐振常常具有声冲击。不象用于传
3统响应水准测量的试验麦克风,听众能四处运动,并且及时地能检测和知道消失于宽带谐振的信号衰减。共轭校正消除该困难,并且有助于改进来自辅助平衡系统的结果。
稳定谐振(WCC1、WCC2至WCCn)-使用多谐振器切口和加权侧能量增强的隐藏补偿过程按频率放置,并且由这些控制参数调节。减小或除去来自延迟节点谐振和驻波干扰的声结果。
耦合和损失因数(|A|0、|A|1至|A|n及O1、Q2、至Qn)-用于某些频率的Q参数能估计为材料、设计、及对于扬声器普通的结构材料尽力的缺省值。由于几乎不可能由响应线图或简单测量偶然确定Q,所以固定值是实际的,并且缺省值选择简化和减小调节的数量。
波干扰(Td)-扬声器壳体的有限尺寸能创建在辐射表面后的波相关干扰压力。通常因为校正响应的复杂性忽略该问题。昂贵扬声器用具有紧密磁耦合的大电机组件建造,以战胜回波干扰。这些系统常常具有内隔板、不同类型呼收材料的层、专门成形的腔、或传输线管,以便有助于除去干扰。典型扬声器呈现来自其简单箱型壳体的建设性/破坏性波干扰,这些壳体最终引起随频率增大出现的响应波纹。关于短接效应、和来自BL的阻尼的奇异性变坏由较小磁铁、还原钢和其它经济因素减小。校正由来自一个延迟和反馈环路过程的共轭相反响应进行。尽管模拟实施是可能的,但DSP方法更经济,并且通过其本性进行对于要固定的物理性能和问题进行良好平衡。类似校正能减小来自地板、台面、墙壁等的反射干扰。
倾斜(dB)-大多数同辈听众喜爱响应随增大频率稍微降低的扬声器。当使扬声器便宜时,其响应往往升高。补偿系统校正由减小磁铁重量发生的多个问题和变化,改进效率及扩展高频响应。然而,由这些共轭校正
创建的平声学平衡与当代音调标准相比可能听起来模糊或贫瘠。倾斜创建一个补偿响应斜率。倾斜参数象一种音调控制操作,并且用来实现希望的低音-高音平衡。LX和HX的内部操纵、以及传统响应水准测量方法或过程能创建该响应。
延迟或全通-该参数及时除去信号以补偿从不同地方辐射高和低频率的换能器。调节能减小群延迟失真,改进与次低音喇叭的相位匹配,及对准过渡响应。使用物理或电气测量能进行调节。
图8a至8f表示控制板显示和用来调节参数的菜单。测量数据、设计表示、及响应曲线提供有用的信息以对于扬声器调节或调谐系统。系统产生对于扬声器那些的共轭响应,并且静静地除去延迟或长稳定机械声音。经验已经表明与更复杂常规水准测量实践相比用于许多收听位置的较好性能。对于这些功能的实施能利用普通数字过程。示范已知的数字过程在附录A中表示。可选择的已知数字实施能用来实现完全类似的结果。
使用模拟电路也可以实施补偿系统。然而,多谐振器或耦合功能的部分不可能跟踪宽调节范围,除非他们是复杂的。所以对于其功能性和与熟知较好DSP平衡的相似性表示模拟电路。这些电路具有可调节参数控制,但他们要求元件变化以模拟关于数字系统固有的参量对准精度。如下例子是具半参量调节能力和产生象描述的那些共轭响应的传统电路。
截止滤波器-Sallen和Key电路能形成具有可调节波峰响应的有源高通和低通滤波器。图9表示配置成一个单op amp的两个滤波器。中带响应是平的,并且截止斜率是+和-18dB每八度。LP和HP的波峰振幅是可调节的,并且与图4b相对应。然而,对于该电路必须预置频率。对于该例子,两部分因为其宽频率分离不相互作用。
恒定斜率均衡器-在有源反馈电路中改变RC时间常数以创建象图4a的响应曲线。表示在图10中的电路是成熟参量音调控制的提升半。对于在搁置与交叉之间的良好参量独立限制其调节范围。
参量切口-图11和12表示具有宽调谐范围的简单模拟切口电路。切口深度保持恒定,但Q随频率设置增大。能选择元件值以对于实际调节范围向Q0、Q1至Qn提供合理近似。
加权补偿切口-一个合成滤波器元件由一个或多个尖锐切口组成,每个切口使能量添加到 抑制频率的一侧或两侧。当认真选择其抑制和提升能量和带宽时,滤波器系统能借助于对于声平衡的很小折衷或改变除去多余能量。用于此目的的抑制切口是尖锐的,具有高衰减及一般是高Q。侧带补偿或恢复最好由在抑制两侧处的提升响应进行。然而,单侧补偿可能更好地为具有组合响应滑离和干扰能量问题的扬声器工作。不对称提升有助于弄平频率响应。其它方面是相同的。补偿能非常小,具有低Q,及当过程是通或断时,在集中到校正的一半到一个八度带中的平均粉红噪声能量是恒定的。
来自声音的衰减感觉移动到低Q侧带频率。因此,用于较好立即过渡响应稳定的双调谐对准希望是一种单侧或单调谐提升方法。能认真调谐和定比例生成合成滤波器,从而它能静静地在有用频率范围上调谐。没有加权,在校正任一侧的小响应损失影响鼻音。着色可能是微妙的,但当使用较多校正时,损失能克服任何优点。如果仅使响应是平的则这特别真实,因为它可能具有标准实际平衡。加权消除折衰,并且允许多重校正更有效而没有声相互作用,及当无意校正应用于具有不同性能性质的扬声器时,也消除损失。
对于任一种实施,适中加权响应切口能由添加到信号上的谐振和反谐
振响应组成。参照图13,校正元件可能包括单高Q切口,其频率集中在性能模式上。一个低Q提升响应放置在相同频率处以提供补偿等重量能量。图13的电路部分表示在反馈路径中有源电路切口和无源LRC提升谐振器的实际结合。两部分都创建加权响应切口。然而,限制调谐范围,并且低Q提升可能是可听的,因为人类听觉能分辨衰减到低Q谐振的过渡声音。
一个更好的选择例是使用两个低Q谐振提升响应,每个调谐并且放置在高Q切口的一侧或两侧处。图14表示由四个可调谐双象限(bi-quad)谐振器或状态可变滤波器组成的例子。滤波器的两个创建封闭隔开的高Q切口,而其它两个提供在外部高和低侧处的提升低Q能量。这些状态可变滤波器容易用DSP处理器创建,并且它们在宽调谐范围上保持恒定的Q和切口深度。创建图15中表示的响应的模拟系统具有在单轴上联接的八个精度可变电阻器,以调谐WCC1或加权切口参数。图13表示用于四部分之一的一个电路。图15表示用于两个不同Q设置的响应曲线,并且这些与图4d中的那些相关。能对准双调谐提升以对于过渡产生较快和较小的设置响应。象来自图的那样的双调谐切口提供类似的优点,并且也提供死带或带抑制能力,以容纳从一个扬声器到另一个的制造公差。仍然需要侧频率提升,并且最好使用双调谐谐振器。
当相邻性能模式具有类似性能时能进行其它变化和简化,就象对于大多数扬声器可能的那样。两个或多个抑制切口能分享Q和振幅设置以及补偿提升。组合包括具有三次提升的两个切口、具有两次非对称提升的两个切口、具有两次的三个切口等。能使用在两个切口之间有频率减半(halfway)的单低Q提升。具有频率在下面、在上面和在其之间的三次低Q提升是一种较好的变化。对于所有这些实施,切口深度常常较大,并
且侧频率提升通常较小。通常,使对于关于补偿区域平均的随机噪声的整体能量响应相同或稍高于没有校正。
延迟干扰或全通-一个混合模数CCD设备能创建一个较小、便利的可调谐延迟。尽管性能可能较差,但它们能象图16中的例子那样连接或配置,以提供干扰状性能。该电路能创建对于来自墙壁、桌子及扬声器壳体内部或者传输路径或系统的其它部分的波长有关反射和传输性能的近似共轭响应。电路能设置成创建一个倒相梳状滤波器或辅助干扰状响应,该响应在时间、相位及振幅方面与来自反射表面的下层干扰损失相反。校正提升消除干扰的地方。该电路也能调节成具有象响应的梳状滤波器以抵消来自扬声器壳体内的反射的辅助能量。由DSP过程能形成较好时间延迟干扰滤波器或梳状滤波器状响应。模拟和DSP都能配置成与物理反射模型相关,并且校正系统的类似其它部分由与物理性能相关的参量调节控制。延迟干扰路径滤波器具有关于尺寸、表面吸收、及需要的干扰校正量的控制。
参照图16,Td与在从扬声器到听众的直接路径与也从扬声器到听众的较长跳回路径之间的差有关。Td也与在扬声器与壳体内的相反表面之间的出去和返回路径有关。同样能特征化在扬声器后面的壁。较大Td给出较大距离。RC与表面粗糙度或在高频下的吸收有关。RC乘积越大,上部频率梳状滤波器响应和校正的损失越大或衰减越快。控制R1调节响应或校正的数值。CW方向增大下层响应,同时靠近至op amp的+输入的CCW位置给出最大辅助响应。该电路产生一个其振幅随频率减小的干扰响应。这匹配或模拟实际扬声器吸收材料的损失。对于显得更容易由补偿系统处理的物体,能试验地改变来自小扬声器的不规则响应的大部。通常,实现这点的延迟设置匹配从扬声器壳体期望的后到达波关系。
当它做时,这样一个可调节等于常规响应水准测量过程的一个数值。
图17是一个全通或相位移动网络。其频率响应是平的,然而其输出在高频下同相而在低频下异相。电路改变过渡响应而不改变频率响应。可变控制增大过渡频率,因为它转向CW。该元件是有用的以校正群延迟或其它过渡相关响应。
如上所述,由扬声器产生的机械干扰常常是可听的、而是不可见的或者仅以由使用频率扫描和麦克风进行的响应测量难以译码。使用深切口的传统补偿方法通常导致鼻音或有害平衡象差。本发明的加权补偿切口滤波器解决该问题,并且也产生一些其它优点。当两个驱动器(低音喇叭和高音喇叭)仅由一个电容器或由重叠频率的电路横穿时,一个或两个驱动器能具有干扰补偿而没有对于其它的感觉损失。同样适用于不同的收听位置。能补偿具有坏响应的一个位置而不折衷用于其它收听位置的声音。校正由加权侧能量隐藏。由于良好的收听位置不会由校正折衷,所以宽范围的收听位置能具有良好声学。这种特征对于用于剧场声音的喇叭形扬声器特别有用,其中从一种安装到另一种需要稍微不同的校正。通过对于一类扬声器或建造特征使用缺省优化,参量控制和调节是简单和直观的。
扬声器最重要性能的一些(相对于声学可感觉效应)不能由传统方法模型化或实施。这样的性能包括干扰和谐振耦合、以及来自这样的性能的非线性结果。另外,需要考虑与运动部分的刚度和用于远离驱动音圈的运动的高频去耦有关的其它空间因素。任何这些能创建源运动、延迟能量释放和对于双耳听觉的相位误差。常常是,这样的破坏性响应可能是不可见的,或者非常难以由传统麦克风和频谱分析仪校准方法解释。
参量寻址对于特定物理效应的补偿的一个例子是对于在大全范围扬声
器中机械去耦的补偿。这样的扬声器通常设计成在低频下具有全部锥运动。在高频下,只有驱动器的内部是主要有源辐射器。锥的其余部分是有意去耦以衰减其节点分散。这种设计选择改变一个等效辐射源的位置。及时向前运动高频辐射的一种线性校正使用混通滤波器以创建较低频率的频带限制延迟。然后,当频率增大时,潜在延迟减小,由此保持对于扬声器的响应级的相位匹配。这样能除去一些群延迟失真。来自扬声器的物理尺寸以及锥的衰减和声速性质能产生规定来自专用滤波器过程的校正的信息。然而,能试验确定延迟效应和去耦频率以产生参数值。如果扬声器部分的一些改变尺寸或衰减性质,则能外推新的值。
难以或不可能使用传统方法补偿的一种参量寻址补偿的一个例子是在小扬声器中对Doppler调制的补偿。计算机和多通道声音系统需要小扬声器奏得非常响亮。快速、高位移锥运动的生成组合能把辅助或减缩速度传给复制的声音。扬声器锥的低频运动通过运动有效高频辐射区域传递Doppler调制效应。该效果十分烦人,并且创建象征着小扬声器努力奏得响亮的声音。当辐射区域、频率、及声学功率输出已知时,能进行生成锥运动和Doppler辐射因数的合理准确计算(见图5)。为了校正扬声器响应创建一种相反交替时间延迟。这种倍增或非线性过程能使等效辐射源更稳定,从而减小非线性失真。扬声器的一个良好性能模型和一个单尺寸参数能规定校正。任何这样的开环或前向非线性校正非常难以实现。模型化时间延迟调制在它提供准确的共轭响应校正时要好得多。例子包括在这里,因为来自低音驱动器的锥运动由模型合理地预测,并且来自DSP方法的瞬时校正将及时变得更实际。通过使用由电压控制振荡器时钟操作的CMOS型模拟延迟进行试验。一条路径补偿来自两个“斗链式”器件的等待时间,而另一条接收可变时钟以产生延迟调制。
对于节点弯曲、波干扰及非线性运动情形,通过使用加权切口过程的性能响应的除去或衰减是一种良好的折衷。加权补偿能参量运动到需要它的地方。如果需要,则能调制其严重性,以最好地匹配程序动力学、来自扬声器的失真、及人类临界频带听觉。
当声频信号的动力学被探测和用来改变参数或隐藏补偿时,辅助低音输出能力和响应扩展可能较差。这种技术能为由改进方法操作的任何扬声器系统工作。
然而,如果把扬声器的部分设计成要求动态补偿,则辅助性能特征是可能的。目的在于特定系统的调节列表或位图能具有与一般目的系统相同的参数和调节,即控制具有共同的特征。因而带有补偿系统的电子系统能够接收指令,以补偿和优化能附加到其上的各种扬声器模型和产品,两种通用扬声器和专为具有补偿系统的用途设计的那些。当需要时,系统能改进清晰度、成象、及低音扩展而不改变声平衡,即保持生产线的声印记。
参数创建的调节效应由包括在上述表格中的符号或缩写词描述或表示。以这种方式,数学命题、电路、扬声器设计特征和其它特定语言统一到程序员或用户能直观解释的列表。然后,响应曲线、性能特征、波长关系、以及对于人类感觉重要的其它东西,变得与用于扬声器系统的设计和/或补偿的过程模型有关。简化补偿,因为在设计和性能变化与基基本关系之间的相互作用是有意义的和直观的。
稳定和节点补偿参数调节包括单位为Hz的频率、作为一个数的Q、及单位为dB的抑制。由于多阶节点性能是可能的,所以Q和抑制调节对于多于一个的补偿频率更可能具有类似值。能链接控制,从而单位为Hz的两个或多个频率能规定对于共同共享机械或干扰性质的节点性能的
校正。
用于扬声器锥的钟形模式补偿提供一个良好例子。几种方法能确定这些频率。使用正弦波激励和光学干涉测量法能观察多节点或波相关干扰。能解释来自图7中所示的MLSSA型刺激、或微分麦克风探针的瀑布图线,以揭示来自分散的稳定能量。这些性能是可听的,并且在频率中能人工或缓慢地扫描隐藏补偿过程,以揭示在粉红色噪声复制期间的声变化。试验方法需要小心和经验,因为室内回声能模拟机械声音。在三种技术之间的相关是良好的,并且当确定来自类似原因的几个频率时,类似Q和共享提升参数的合成加权切口简化校正。
以上参数和其调节改变用于扬声器特定性能的配置补偿。一些过程固有地限制到一个窄频率范围,其中特定种类的性能最可能从扬声器系统发生。影响时间和响应斜率的其它覆盖一个宽频谱。这些专用操作彼此足够隔离,从而在他们之间的相互作用较小。能改变选择参数而不影响其它。另外,数据要求对于有用的调节分辨率是合适的。
如在以上扬声器例子中描述的那样,调节补偿系统的控制与扬声器的物理部分和声学性质有关。以相同方式能改进类似、但不准确设计或构造的其它扬声器。这样做的控制或规格信息具有相同简单、直观的语言。一个较小便宜扬声器能借助于16次参数调节和几个缺省设置显著改进。为了匹配来自该系统的复杂响应,传统多频带或图形均衡器需要远超过100频带、和多得多的控制信息。
补偿系统使用斜率、交叉、和其它数学函数创建对于扬声器特性的预计校正。这些操作由系数或点、和由过程命令控制,代替来自对于线性线图的证明和计算响应。由于每个过程具有一个特定本性,所以频率范围、振幅、Q等把参数范围限制到一个控制空间的较小部分。一个三字
+代码能创建一个精确放置的谐振器或复杂加权的响应切口子系统。在8位代码字的情况下,该图或信息序列给出用于一个对数频率十进制的128个点、在用于振幅的1/2dB步长中的+/-20dB、及16个Q设置、以及用于过程命令和控制格式化的空间。对于该例子,在声频带中的384个点或频率适用于设置尖锐抑制切口和加权补偿。用于其它参量控制和过程命令的位图可能要求较小分辨率,因而提供甚至更大的经济性。这种紧凑规格特征能用于校正特定扬声器设计的补偿系统的条码安装,或用于来自在诸如用在HDCD系统中之类的数据流中隐藏的代码的过程的动态控制。如下面详细描述的那样,当减小处理信息范围时,诸如助听器和通信系统之类的可携带设备受益。
对于多种用途,对于在包括十个基本操作,即搁置、切口、补偿、截止滤波器、延迟等的成功过程可以选择在声频带中的384个点或频率。过程规模随分辨率非常迅速地增大:抑制切口可能是尖锐的并且需要准确调谐,干扰补偿固有地复杂,及来自传统测量实施的扬声器响应揭示简化处理的很少有用信息。如果不把补偿系统设计成识别和处理来自曲线的子系统或模型化响应,就必须在一点一点的基础上进行校正。即使进行良好的响应校正,这种方式也要求显著的过程功率。当考虑时间、相位及稳定问题时,常规处理的范围加宽。对于这种情形,分辨在三维栅格(如瀑布线图)中的任何地方的有用校正响应需要的滤波器或过程的数量可能是不实际的。当把滤波器或处理功率分配到要求较高分辨率和较多校正活动的栅格的那些部分时,一些经济性是可能的。即使这些努力没能实现,隐藏或补偿校正也有利于补偿系统。
这种困难的一个良好例子由图6是显然的。补偿系统具有8个切口、用于切点校正的一个加权切口、及低频提升交叉和搁置。高频降低把交
叉提供给高音喇叭。显然,画出点创建响应合成的困难是显然的。补偿系统由24次调节(LX、LS、LP、W0、Q0、|A|0、W1至W7、|A|1至|A|7、WCC1、及一个缺省Q设置)创建这种共轭。
与补偿带中信号去除类似的策略能用于最高和最低频率。例如,由来自低音能量的过分锥运动引起的失真通过减小至扬声器的输入可能是有害的。实现这点的一种方法是把低频响应限制到一个实际值。十分可能的是,扬声器已经能够进行在截止下面的弱低音复制,条件是程序材料不会掩蔽较低的低音信号。宽动态范围程序材料能强迫扬声器在这些频率下产生可感觉输出。不幸的是,生成弱输出频繁地由在人听觉的相同感觉频带中的其它声音覆盖。所以,多半时间来自扬声器的扩展响应是无用的,并且仅添加失真和消耗放大器功率。
补偿系统的加权响应校正能应用于低或高频宽带或者截止抑制或滤波器的可听侧。如果认真地做,则感觉响应显得未改变,并且能使扩展声音象它在滤波之前那样。打算复制大功率、次可听或次声能量的大系统需要一种不同的方法,尽管相同的方法适用。
补偿系统把一个扬声器模型与共轭过程组合,创建一个其声学输出具有低群延迟失真的零相位位滤波器。对于这种用途,波峰响应不仅遵守标准实践,而且用在对准中以帮助改进群延迟,并且成为允许频带限制特征接通或断开的隐藏补偿的部分。
当象选择上述那样的中性时,能使补偿系统改变其截止深度和具有最小听力的补偿能量。这种特征允许补偿系统由音量的变化跟踪或调制控制设置、功率级、或竞争感觉频带的程序条件。以这种方式,在失真插入之前,带宽限制能迫使较多功率到扬声器。由于现在定量可听能量,所以较小放大器能产生相同的重放音量。
这些因数具有经济重要性。扬声器具有这样设计的部分,从而系统能从补偿系统受益。它们具有较短音圈和较小重量的锥以从放大器产生较高声学输出。效率较高,但机械性能常常折衷,并且来自这样一种设计的声学输出往往随频率升高。没有校正,扬声器听起来刺耳和尖叫,并因此必须补偿。然而,一旦这些变化由补偿系统校正,扬声器就奏得更响亮,能更小,并且能使用更低功率的放大器。
如果选择虚拟低音扩展,则在频率中借助于认真制订的策略运动波峰或补偿响应。在频带边缘处的过程设置和有关声学波峰频率变得取决于程序材料的低音含量、放大器的功率保存、及扬声器的运动能力。当重放级较高,并且低频能量较强时,波峰响应在频率中向上运动,以保持合理的锥运动和失真性能。
大多数娱乐系统带有均衡器、音调控制、及其它用户操作或启动的特征。需要声学可见性。补偿系统最好与这些级联工作,并且能改进其性能。一旦扬声器系统具有由补偿系统提供的更理想化辐射性能,各种响应水准测量系统就不必分类或推测从麦克风取出的测量响应的哪部分源于扬声器或源于室内。补偿系统能更有效地从可能损坏相位响应或不适于其它听众位置的这些响应水准测量程序,消除不适当的均衡。级联操作也保证除去由传统方法不可辨别的响应引起的扰乱机械声音。人双耳听觉擅长感觉、识别、及定位这些声音。一旦除去它们,传统均衡方法就能提升没有刺耳声的高频、和没有箱隆隆声或最小构造的模糊声音特性的低频。
对于补偿系统,特定模拟功能块电路能形成简单的实用系统。用于其可调节部分的响应范围能由共轭模型预计,从而平行信号路径和多个共享功能是可能的。在单条路径中需要少得多的有源设备,由此减小成本
和失真。一些时间有关校正由全通滤波器是可能的,而其它延迟操作是不实际的。
在扬声器上下文中的补偿系统的示范模拟和DSP实施分别提供在附录B和C中。补偿系统的其它用途的描述如下。
通信系统-通信系统可能经受多余的窄带噪声或在固定或变化频率下的音调。十分经常的是,一些时间等待适用于允许子系统辨别和跟踪这样的音调。当创建除去干扰的异相信号不实际或不可能时,补偿系统实现一种有效结果。常常是,有可能用参量可运动加权响应切口跟踪干扰。如果不是信息信号具有与受抑制的相同的频率,则校正将是有效的而不降低或改变声音。常常是,通信系统具有换能器,如作为声音复制系统部分的麦克风、耳机和扬声器。这些元件能具有能作为一个系统个别或集体补偿的多余响应。一个或多个处理器能放置在信号链中的任何处。它们能控制或编程成补偿许多元件部分混合物,如换能器、信号路径、人听觉要求等。为了建立这样一种系统,控制参数信息可以由在信号路径中的隐藏代码辨别或估计。辅助通道、以及其他装置,能用来传送该信息。由于补偿系统有效地使用该信息创建非常复杂的响应,所以校正过程能建立在多个系统中。例子包括计算机扬声器、用于听力损伤的电话系统、及移动通信。对于这些系统,处理器能在外部或不是未端用户器具的部分。所以,补偿系统能编程为器具的一种具体模型,并且外部致动。处理器的部分、全部能随器具存在或不随其存在。
助听器-许多听力困难产生于对听觉神经内茸毛细胞的损坏。常常人们受耳鸣或头晕(head ringing)之害,并且具有理解在拥挤嘈杂房间中的对话的困难。有时与一个窄频带相对应的一个封闭空间群细胞已经有机械损伤,引起对高强度刺激的过分神经响应。这种作用常常听起来不和谐
和疼痛。它可能引起至和来自大脑的听觉反馈路径的中断,从而启动过早保护功能,由此加重不愉快感觉。由于引起机械运动的刺激是在由医学试验例行程序容易定义的频率范围中,所以能容易地把参量加权切口滤波器调谐到相同频率,以阻塞刺激这些细胞的声音传输。如果对于个人适当地建立辅助加权,则减小对于其它声音的感觉损失。在一种典型情况下,切口必须具有可能必须随声音压力级变宽的带抑制特性。补偿侧能量跟踪这些变化以对于其它声音减小清晰度损失。设计成进行这种校正的系统能更有效,并且其特定处理可能吸收比通用响应造型方法少的电池功率。
水印辨别-一种记录能借助于由一个尖锐切口除去的已知频率形成。如果相同记录需要以后辨别,则能使系统查寻已知的丢失频率。人们能期望颤动、噪声、及未预计时钟速率,以便移动死频带和创建多种困难。记录可以使用音乐信号定义操作频率和编码安全切口的计时。减小时钟依赖性,并且使用数码键防止某人找到这些频率和改变目的。在重放期间,程序的键辨别部分启动用于确认的译码参数。象上述的通信系统那样,记录切口应该尽可能好地安静或隐藏,并且可能从一个频率跳到另一个。参量控制加权补偿方法对于这种用途是理想的,并且键入频率跳跃和隐藏的组合为一种有效安全系统提供。
从声音系统消除反馈-涉及声音的同时获得和复制的较大声音增强设施、电话、和其它系统经受反馈。通常,一个麦克风拾波复制声学信号的某一部分,并且添加到引起振荡的信号上。扬声器电话的成熟DSP部分能分类房间回声和串音的相位关系,以使声音传输清晰并且消除反馈。频移器随机化反馈相位以防止嗥鸣或高Q松散耦合振荡的缓慢建立。有时,来自这些方法的潜伏与级性能或同步干扰。能把可调谐加权切口设
置到灵敏频率以消除振荡而没有对于声音的显著损失。双或多调谐样式彼此没有什么相互作用,并且固有死带使调出反馈容易得多。
CD唱机-一种以数字或模拟域(或两者)操作的典型电子系统可以组合有意用户调节和补偿系统。部分描述、数学模型、测量数据、及人类喜好信息可以组合,并且并入其设计中。一旦定义参数,并且确定其系数值,一个组织群数码就能编程电气或数学系统,以对于扬声器的不同形状和尺寸进行特定校正响应。参数列表、和甚至个别校正模型能下载到在CD唱机或其它设备中的一个数字信号处理器。这种操作能在任何时间进行,从而它提供可编程升级。它能由条码、远程控制致动,从计算机下载,或安装到专用唱机/扬声器组合上。
尽管已经表明和描述了本发明的几种具体形式,但显然,能进行各种修改而不脱离本发明的精神和范围。
附录A
图A1、A2和A3表示用于低通滤波器(LP)和高通滤波器(HP)截止滤波器的可能实施。这些具体滤波器的量级保持得较小以支持低MIPS实施。图A4表示用于高和低搁置均衡器的可能实施。这些均衡器用于LS和HS。图A5表示可用于提升或切口实施的参量均衡器实施。这样的均衡器的组合能结合,如图A6和A7中所示,以建立补偿切口效应。定义传递函数(第一列是在传递函数中的分子系数,而第二列是在传递函数中的分母系数),所以该滤波器是一个二阶IIR。 画出滤波器的频率和相位响应x:=0,.001...5G(x):=|gain(D,x)|
图A1
定义传递函数(第一列是在传递函数中的分子系数,而第二列是在传递函数中的分母系数)。所以该滤波器是一个二阶IIR。
计算增益补偿
K=0.909画出滤波器的频率和相位响应x:=0,.001...5G(x):=K|gain(D,x)|
图A2
定义传递函数(第一列是在传递函数中的分子系数,而第二列是在传递函数中的分母系数)。所以该滤波器是一个二阶IIR。
画出滤波器的频率和相位响应x:=0,.001...5G(x):=|gain(D,x)|
图A3
定义传递函数(第一列是在传递函数中的分子系数,而第二列是在传递函数中的分母系数)。所以该滤波器是一个一阶IIR。
在DSP实施中,按以上信号流程计算滤波器输出。下面我们通过必要地变换全通部分的分子计算以上系统的整体传递函数。
图5A(第2页,共2页)
加权切口#1数字实施包括使用在“基于全通部分的切口/参量EQ部分”中描述的程序设计的3参量EQ部分2低Q增益部分围绕临界频率切口对于补偿部分#1和#2(分别为D1和D2)Q是2而k是1.5,导致下面的传递函数。生成滤波器是两个2阶IIR滤波器,其中列0表示分子,而列1表示分母。
对于临界频率部分#3(下面的D3)Q是10而k是0。生成滤波器是一个二阶IIR滤波器,其中列0表示分子,n0而而列1表示分母。
级联的3IIR滤波器的整体频率响应的线图x:=0,.001_0.5G1(x):=|gain(D1,x)|G2(x):=|gain(D2,x)|G3(x):=|gain(D3,x)|H(x):=20-log(G1(x)·G2(x)·G3(x))
图A6
加权切口#2的数字实施包括使用在“基于全通部分的切口/参量EQ部分”中描述的程序设计的3参量EQ部分一个中Q增益补偿绕两个切口对中对于补偿部分#1(下面的D1)Q是2而k是的4,导致下面的传递函数。生成滤波器是两个2阶IIR滤波器,其中列0表示分子,而列1表示分母。 对于临界频率切口部分#2和#3(下面分别是D2和D3)Q是10而k是0。生成滤波器是一个二阶IIR滤波器,其中列0表示分子,而而列1表示分母。 级联的3IIR滤波器的整体频率响应的线图x:=0,.0001_0.5G1(x):=|gain(D1,x)|G2(x):=|gain(D2,x)|G3(x):=|gain(D3,x)|H(x):=20·log(G1(x)·G2(x)·G3(x)) (级联响应)
图A7
附录B
图B1是用来补偿一个带有5英寸低音驱动器和3英寸高音喇叭的小书架扬声器的补偿系统的方块图。扬声器的特征如下:低音唔喇叭:圆顶=4.33k(带有LC的切口)
锥=4.9k(仅有补偿切口)
锥的边缘=2.8k(有源切口)高音唔喇叭:圆顶=15.1k(没有补偿)
锥cr=11.6k(有源切口)
锥cr=9.32k/9.45k(阻尼复合)
W0=1.38k(LCR切口)
提供十四种调节。图B2表示用来创建L
X、H
X、L
S、H
S、L
P、和H
P滤波器和参量调节的电路。添加较低频率截止波峰,以创建一个8英寸书架系统的响应特征。对于该电路,Q和波峰振幅由方框标记的元件设置。图B3和B4表示W
0切口部分和用于扬声器的代表性调谐。dB为单位的W
0…和|A|是可调节的,而一个电阻器设置Q。这些的两组进行四种调节。图B5表示一个单低Q提升。用于提升和频率的调节由op amp部分提供。图B6是用于时间校正的全通均衡器。全通均衡器组合来自六个有源过程电路的输出。
图B1
调节的斜率EQ和带通滤波器
WL=65Hz,44Hz(平行引出头)
WH=17kHz
WLX=400Hz->20Hz
图B30.0015=3.2-3.6k(2.5k->6.8k)0.0033=1.4->1.7k(1.2k->3.3k)0.0047≌900-1.2k(800->2.2k)0.15=120(80-220)LOWQ R|A|=47k||33k
RQ=68k||100kVOUT=10VppMAX
图B4
图B50.033=270->1.4k0.0068
700Hz opt
@3/4 max W0
附录C
使用一个标准PC和一个Motorola EVM56362 DSP估计板实施一个计算机调节DSP补偿器。源代码和应用提示如下。
扬声器调谐应用程序提示
扬声器调谐应用程序写作使用目标取向MFC应用程序框架的Windows OS 32位应用程序(请参照对于Microsoft Visual C++开发环境包括的MFC的文件编制)。该应用程序带有一个对话接口。主对话类,CTabDialog,是MFC CDialog类的一个子类。CTabDialog类实现一个“标记”对话接口。在对话中的每个标签是MFC CPropertypage类的子类。每个标签表示扬声器校正算法的不同方面。如下是标签类的列表:
●CMainpage,尤其实施用于前和后音量控制的UI
●CShelvpage,实施用于低和高搁置均衡滤波器的UI控制
●CCutoffpage,实施用于低和高波峰截止滤波器的UI控制
●CNotchpage1和CNotchpage2,实施用于多个切口滤波器的UI控制(为了例如限制在扬声器中的谐振)
●CStWaveRijecetpage,实施用于能限制在扬声器箱中的驻波的一组滤波器的UI控制
●CDBNotch,实施用于双调谐切口滤波器的UI控制
●CAllpasspage,实施用于二阶全通滤波器的UI在每个标签页上的每个可调节参数由CSlider类的实例表示。每个UI滑动器具有4096个分立值的范围。当用户操纵UI滑动器时,把一条消息从标签页送到CDSP56Manager类的实例。在该类中,适当的计算发生以把线性输入值转换成计算由用户设置表示的传递函数必需的一个或多个值。使用一个I2C串行连接把这些计算值传输到DSP。DSP执行对于上述传递函数的实时实施必需的计算。DSP能够实时地计算一系列滤波器计算,以允许实现所有扬声器校正滤波器的总级联传递函数。DSP能接收模拟或数字数据,并且传输处理的模拟或数字输出数据。
// COMPortChooser.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"COMPortChooser.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] =__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCOMPortChooser dialog
CCOMPortChooser::CCOMPortChooser(CWnd*pParent/*=NULL*/)
:CDialog(CCOMPortChooser::IDD. pParent)
{
//{{AFX_DATA_INIT(CCOMPortChooser)
// NOTE:the ClasWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CCOMPortChooser::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCOMPortChooser)
// NOTE:the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCOMPortChooser,CDialog)
//{{AFX_MSG_MAP(CCOMPortChooser)
ON_BN_CLICKED(IDC_RADIO1,OnRadio1)
ON_BN_CLICKED(IDC_RADIO2,OnRadio2)
ON_BN_CLICKED(IDC_RADIO3,OnRadio3)
ON_BN_CLICKED(IDC_RADIO4,OnRadio4)
//})AFX_MSG_MAP
END_MESSAGE_NAP()
/////////////////////////////////////////////////////////////////////////////
// CCOMPortChooser message handlers
void CCOMPortChooser::OnRadio1()
{
// TODO:Add your control notification handler code here
which_port=1;
}
void CCOMPortChooser::OnRadio2()
{
// TODO:Add your control notification handler code here
which_port=2;
}
void CCOMPortChooser::OnRadio3()
// TODO:Add your control notification handler code here
which_port=3;
}
void CCOMPortChooser::OnRadio4()
// TODO:Add your control notification handler code here
which_port=4;
<dp n="d52"/>
}
BOOL CCOMPortChooser::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO:Add extra initialization here
which_port=3;
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
<dp n="d53"/>
// CutoffPage.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"CutoffPage.h"
#include"DSP56kManager.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCutoffPage property page
IMPLEMENT_DYNCREATE(CCutoffPage,CPropertyPage)
CCutoffPage::CCutoffPage():CPropertyPage(CCutoffPage::IDD)
{
//{{AFX_DATA_INIT(CCutoffPage)
//}}AFX_DATA_INIT
}
CCutoffPage::-CCutoffPage()
{
}
void CCutoffPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCutoffPage)
DDX_Control(pDX,IDC_CHECK6,m_BypassSecondButton);
DDX_Control(pDX,IDC_CHECK5,m_BypassFirstButton);
DDX_Control(pDX,IDC_SLIDER6,m_HiBoostSlider);
DDX_Control(pDX,IDC_SLIDER5,m_HiQSlider);
DDX_Control(pDX,IDC_SLIDER4,m_HiFreqSlider);
DDX_Control(pDX,IDC_SLIDER3,m_LoBoostSlider);
DDX_Control(pDX,IDC_SLIDER2,m_LoQSlider);
DDX_Control(pDX,IDC_SLIDER1,m_LoFreqSlider);
//})AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCutoffPage,CPropertyPage)
//{{AFX_MSG_MAP(CCutoffPage)
ON_WM_VSCROLL()
ON_BN_CLICKED(IDC_CHECK5,OnBypassFirst)
ON_BN_CLICKED(IDC_CHECK6,OnBypassSecond)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCutoffPage message handlers
BOOL CCutoffPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO:Add extra initialization here
m_LoFreqSlider.SetRange(0,CONTROL_RANGE);
m_LoFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Freq));
m_LoFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_LoQSlider.SetRange(0,CONTROL_RANGE);
m_LoQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Q));
m_LoQSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_LoBoostSlider.SetRange(0,CONTROL_RANGE);
m_LoBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Boost));
m_LoBoostSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_HiFreqSlider.SetRange(0,CONTROL_RANGE);
m_HiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManger->GetParamValue(kNotch7Freq));
<dp n="d54"/>
m_HiFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_HiQSlider.SetRange(0,CONTROL_RANGE);
m_HiQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Q));
m_HiQSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_HiBoostSlider.SetRange(0,CONTROL_RANGE);
m_HiBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Boost));
m_HiBoostSlider.SetTicFreq((CONTROL_RANGE+1)/16);
// g_DSPManager->SetCutoff1Freq(CONTROL_RANGE-m_LoFreqSlider.GetPos());
// g_DSPManager->SetCutoff1Q(CONTROL_RANGE-m_LoQSlider.GetPos());
// g_DSPManager->SetCutoff1Boost(CONTROL_RANGE-m_LoBoostSlider.GetPos());
// g_DSPManager->SetCutoff2Freq(CONTROL_RANGE-m_HiFreqSlider.GetPos());
// g_DSPManager->SetCutoff2Q(CONTROL_RANGE-m_HiQSlider.GetPos());
// g_DSPManager->SetCutoff2Boost(CONTROL_RANGE-m_HiBoostSlider.GetPos());
return TRUE;// return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CCutoffPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar*pScrollBar)
{
// TODO:Add your message handler code here and/or call default
CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
Sleep(50);
if((CSliderCtrl*)pScrollBar==&m_LoFreqSlider)
g_DSPManager->SetCutoff1Freq(CONTROL_RANGE-m_LoFreqSlider.GetPos());
else if((CSliderCtrl*)pScrollBar==&m_LoQSlider)
g_DSPManager->SetCutoff1Q(CONTROL_RANGE-m_LoQSlider.GetPos());
else if((CSliderCtrl*)pScrollBar==&m_LoBoostSlider)
g_DSPManager->SetCutoff1Boost(CONTROL_RANGE-m_LoBoostSlider.GetPos());
else if((CSliderCtrl*)pScrollBar==&m_HiFreqSlider)
g_DSPManager->SetCutoff2Freq(CONTROL_RANGE-m_HiFreqSlider.GetPos());
else if((CSliderCtrl*)pScrollBar ==&m_HiQSlider)
g_DSPManager->SetCutoff2Q(CONTROL_RANGE-m_HiQSlider.GetPos());
else if((CSliderCtrl*)pScrollBar==&m_HiBoostSlider)
g_DSPManager->SetCutoff2Boost(CONTROL_RANGE-m_HiBoostSlider.GetPos());
)
void CCutoffPage::OnBypassFirst()
{
// TODO:Add your control notification handler code here
int state=m_BypaasFirstButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassHipass);
}
void CCutoffPage::OnBypassSecond()
{
// TODO:Add your control notification handler code here
int state=m_BypassSecondButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassLopass);
}
<dp n="d55"/>
#if !defined(AFX_COMPORTCHOOSER_H__BSD510E7_F7D5_11D2_96EE_006097CDB9E2_INCLUDED_)
#define AFX_COMPORTCHOOSER_H__BSD510E7_F7D5_11D2_96EE_006097CDB9E2__INCLUDED
#if_MSC_VER>=1000
#pragma once
#endif // _MSC_VER>=1000
// COMPortChooser.h:header file
//
/////////////////////////////////////////////////////////////////////////////
// CCOMPortChooser dialog
class CCOMPortChooser:public CDialog
{
//Construction
public:
CCOMPortChooser(CWnd*pParent=NULL); //standard constructor
int which_port;
// Dialog Data
//{{AFX_DATA(CCOMPortChooser)
enum{IDD=IDD_DIALOG3};
// NOTE:the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CCOMPortChooser)
protected:
virtual void DoDataExchange(CDataExchange*pDX); //DDX/DDV support
//))AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CCOMPortChooser)
afx_msg void OnRadio1();
afx_msg void OnRadio2();
afx_msg void OnRadio3();
afx_msg void OnRadio4();
virtual BOOL OnInitDialog();
//})AFX_NSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_IMSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_COMPORTCHOOSER_H__B5D510E7_F7D5_11D2_96EE_006097CDB9E2_INCLUDED_)
<dp n="d56"/>
#if !defined(AFX_CUTOFFPAGE_H__6F151625_D84D_11D2_96EE_006097CDB9E2_INCLUDED_)
#define AFX_CUTOFFPAGE_H__6F151625_D84D_11D2_96EE_006097CDB9E2__INCLVDED_
#if_MSC_VER>=1000
#pragma once
#endif // _MSC_VER>=1000
//CutoffPage.h :header file
//
/////////////////////////////////////////////////////////////////////////////
// CCutoffPage dialog
class CCutoffPage :public CPropertyPage
{
DECLARE_DYNCREATE(CCutoffPage)
// Construction
public:
CCutoffPage();
-CCutoffPage();
// Dialog Data
//((AFX_DATA(CCutoffPage)
enum {IDD=IDD_PP7};
CButton m_BypassSecondButton;
CButton m_BypassFirstButton;
CSliderCtrl m_HiBoostSlider;
CSliderCtrl m_HiQSlider;
CSliderCtrl m_HiFreqSlider;
CSliderCtrl m_LoBoostSlider;
CSliderCtrl m_LoQSlider;
CSliderCtrl m_LoFreqSlider;
//})AFX_DATA
// Overrides
// Classwizard generate virtual function overrides
//{{AFX_VIRTUAL(CCutoffPage)
protected:
virtual void DoDataExchange(CDataExchange* pDX; //DDX/DDV support
//})AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CCutoffPage)
virtual BOOL OnInitDialog();
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
afx_msg void OnBypassFirst();
afx_msg void OnBypassSecond();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif//!defined(AFX_CUTOFFPAGE_H_6F151625_D84D_11D2_96EE_006097CDB9E2_INCLUDED_)
<dp n="d57"/>
#if !defined(AFX_ALLPASSPAGE_H_F4767B24_11B3_11D3_96EE_006097CDB9E2__INCLUDED_)
#define AFX_ALLPASSPAGE_H_F4767B24_11B3_11D3_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER>=1000
#pragma once
#endif //_MSC_VER>=1000
// AllpassPage.h:header file
//
/////////////////////////////////////////////////////////////////////////////
// CAllpassPage dialog
class CTabDialog;
class CAllpassPage:public CPropertyPage
{
DECLARE_DYNCREATE(CAllpassPage)
// Construction
public:
CAllpassPage();
-CAllpassPage();
// Dialog Data
//{{AFX_DATA(CAllpassPage)
enum{IDD=IDD_PP10};
CDutton m_BypassButton;
CSliderCtrl m_QSlider;
CSliderCtrl m_FrequencySlider;
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CAllpassPage)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// rmplementation
protected :
// Generated message map functions
//{{AFX_MSG(CAllpassPage)
afx_msg void OnBypass();
virtual BOOL OnInitDialog();
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
afx_msg void OnPaint();
//})AFX_MSG
DECLARE_MESSAGE_MAP()
CTabDialog *m_ParentWindow;
void SendStringToUI(int which);
};
//{{AFX_INSERT_LOCATION}}
//Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif //!defined(AFX_ALLPASSPAGE_H__F4767B24_11B3_11D3_96EE_006097CDB9E2__INCLUDED_)
<dp n="d58"/>
// AllpassPage.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"AllpassPage.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
//CAllpassPage property page
IMPLEMENT DYNCREATE(CAllpassPage,CPropertyPage)
CAllpassPage::CAllpassPage():CPropertyPage(CAllpassPage::IDD)
{
//{{AFX_DATA_INIT(CAllpassPage)
//})AFX_DATA_INIT
}
CAllpassPage::-CAllpassPage()
{
}
void CAllpassPage::DoDataExchange(CDataExchange"pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAllpassPage)
DDX_Control(pDX,IDC_CHECK1,m_BypassButton);
DDX_Control(pDX,IDC_SLIDER3,m_QSlider);
DDX_Control(pDX,IDC_SLIDER1,m_FrequencySlider);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAllpassPage,CPropertyPage)
//{{AFX_MSG_MAP(CAllpassPage)
ON_BN_CLICED(IDC_CHECK1,OnBypass)
ON_WM_VSCROLL()
ON_WM_PAINT()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CAllpassPage message handlers
void CAllpassPage::OnBypass()
{
// TODO:Add your control notification handler code here
int state=m_BypassButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassAllpass);
}
BOOL CAllpassPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO:Add extra initialization here
m_FrequencySlider.SetRange(0,CONTROL_RANGE);
m_FrequencySlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAllpassFreq));
m_FrequencySlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_QSlider.SetRange(0,CONTROL_RANGE);
m_QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAllpassQ));
m_QSlider.SetTicFreq((CONTROL_RANGE+1)/16);
<dp n="d59"/>
m_ParentWindow=(CTabDialog*)GetParent()->GetParent();
return TRUE;// return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CAllpassPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
// TODO:Add your message handler code here and/or call default
CSliderCtrl*slider=(CSliderCtrl*)pScrollBar;
iht which;
CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
Sleep(50);
if(slider==&m_FrequencySlider)
which=kAllpassFreq;
else if(slider==&m QSlider)
which=kAllpassQ;
else
return;
g_DSPManager->SetParamValue(CONTROL RANGE-slider->GetPos(),which);
SendStringToUI(which);
}
void CAllpassPage::SendStringToUI(int which)
{
CString str;
g_DSPManager->GetStringValue(which,str);
m_ParentWindow->SetStatusString(0,str);
}
void CAllpassPage::OnPaint()
{
CPaintDC dc(this);// device context for painting
// TODO:Add your message handler code here
m_FrequencySlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAllpassFreq));
m_QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAllpassQ));
m_BypasaButton.SetCheck(g_DSPManager->GetBypassSection(kBypassAllpass));
// Do not call CPropertyPage::OnPaint()for painting messages
}
<dp n="d60"/>
// DSPComm.h:interface for the DSPComm class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_DSPCOM_H__33F9EF05_F6EF_11D2_96EE_006097CDB9E2_INCLUDED_)
#define AFX_DSPCOMM_H_33F9EF05_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER>=1000
#pragma once
#endif //_MSC_VER>=1000
class DSPComm
{
public:
virtual BOOL IsTransmitting();
virtual long GetDetectState(void);
virtual BOOL CheckState(void);
virtual long SendDSPMemory(char *,long);
virtual long SendDSPWord(long);
DSPComm();
virtual-DSPComm();
};
#endif //!defined(AFX_DSPCOMM_H__33F9EF05_F6EF_11D2_96EE_006097CDB9E2_INCLUDED_)
<dp n="d61"/>
//DSPComm.cpp:implementation of the DSPComm class.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"sa.h"
#include"DSPComm.h"
#ifdef_DEBUG
#undef THIS_FILE
static char THIS_FILE[]=_FILE_;
#define new DEBUG_NEW
#endif
/////////////////// ///////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
{
}
DSPComm::-DSPComm()
{
}
long DSPComm::SendDSPWord(long)
{
return(0L);
}
long DSPComm::SendDSPMemory(char *data,long len)
{
return(0L);
}
BOOL DSPComm::CheckState()
{
return(true);
}
long DSPComm::GetDetectState()
{
return(0L);
}
BOOL DSPComm::IsTransmitting()
{
return(false);
}
<dp n="d62"/>
// DSP56kManager.h:interface for the CDSP56kManager class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_DSP56KMANAGER_H_0CF7E204_D790_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_DSP56KMANAGER_H__0CF7E204_D790_11D2_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER>=1000
#pragma onCe
#endif//_MSC_VER>=1000
#include "DSP56Equates.h"
#include"DSPComm.h"
#define CONTROL_RANGE_L2 12
#define CONTROL_RAGE ((1L<<CONTROL_RANGE_L2)-1)
#define PG_CONTROL_AMT(CONTROL_RANGE/64)
#define CONTROL_RANGE_SC (23-CONTROL_RANGE_L2)
#define DSP_CONTROL_MAX 8388608.
class CDSP56kManager
{
long m_DSPReturn;
long m_Raw2DSPVals[kUIArraySize);
long m_RawVals[kUIArraySize);
long m_DSPVals[kDSPArraySize);
double m_pi;
DSPComm *m_Comm;
public:
void GetPureStringValue(int which,CString &str);
void GetFilterBlob(CStringArray &array);
virtual BOOL GetBypassSection(int which);
virtual void SetBypassSection(BOOL value,int which);
virtual BOOL IsBusy();
virtual void GetStringValue(int which,CString &str);
virtual BOOL IsReady(void);
virtual void SetAnalogInput(long);
virtual int GetHDCDMode(void);
virtual void ResetAll(void);
virtual void SetHDCDGainScale(long);
virtual void SetHDCDBypass(long);
virtual void SetDDXCompBypass(long);
virtual void SetBypass(long value);
virtual void GetDSPSettings(CStringArray &array);
virtual void SetDSPSettings(CStringArray &array);
virtual void SetParamValue(long value,long which);
virtual long GetParamValue(long which);
void DownloadDSPCode(void);
CDSP56kManager(HWND p);
virtual-CDSP56kManager();
private:
void SetNotchQ(long value,long which,long freqwhich);
void SetNotchFreq(long value,long which);
void SetShelvFreq(long value,long which);
void SetBoostCut(long value,long which);
void SetRawValue(long value,long which);
double DoConvertFreqRange(double in,double top,double bottom);
double ConvertFreqRange(int which);
double ConvertQRange(long val);
double ConvertBoostCutRange(long val);
virtual void SendDSPValue(long which);
int ChecksumSREC(char *lineptr,int N);
void GetSRecordAddressRange(char"s,long"start,long *end,char **data);
protected:
virtual void SetDelay(long value);
void SetLoCutoff(void);
<dp n="d63"/>
void SetHiCutoff(void);
void SetHiCutoff2(void);
virtual void SetHiCutoff2Q(long value);
virtual void SetHiCutoff2Freq(long value);
virtual void SetHiCutoffQ(long value);
virtual void SetHiCutoffFreq(long value);
virtual void SetLoCutoffQ(long value);
virtual void SetLoCutoffFreq(long value);
virtual void SetPreVolume(long value);
virtual void SetAnalogVolume(long value);
// virtual void SetCutoff1Freq(long value);
// virtual void SetCutoff1Q(long value);
// virtual void SetCutoff1Boost(long value);
// virtual void SetCutoff2Freq(long value);
// virtual void SetCutoff2Q(long value);
// virtual void SetCutoff2Boost(long value);
virtual void SetShelv1Freq(long value);
virtual void SetShelv1Boost(long value);
virtual void SetShelv2Freq(long value);
virtual void SetShelv2Boost(long value);
virtual void SetNotch1Cut(long value);
virtual void SetNotch1Q(long value);
virtual void SetNotch1Freq(long value);
virtual void SetNotch2Cut(long value);
virtual void SetNotch2Q(long value);
virtual void SetNotch2Freq(long value);
virtual void SetNotch3Cut(long value);
virtual void SetNotch3Q(long value);
virtual void SetNotch3Freq(long value);
virtual void SetNotch4Cut(long value);
virtual void SetNotch4Q(long value);
virtual void SetNotch4Freq(long value);
virtual void SetNotch5Q(long value);
virtual void SetNotch5Boost(long value);
virtual void SetNotch6Cut(long value);
virtual void SetNotch6Q(long value);
virtual void SetNotch6Freq(long value);
virtual void SetNotch7Cut(long value);
virtual void SetNotch7Q(long value);
virtual void SetNotch7Freq(long value);
virtual void SetNotch9Freq(long value);
virtual void SetMainVolume(long value);
};
extern CDSP56kManager *g_DSPManager;
#endif // !defined(AFX_DSP56KMANAGER_H__0CF7E204_D790_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d64"/>
// DSP56kManager.cpp:implementation of the CDSP56kMananger class.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"sa.h"
#include"DSP56kManager.h"
#include <math.h>
#include <stdlib.h>
#include <string:h>
#if 0
#include"unit_ppi.h"
#include"functs.h"
#endif
#ifdef SPI
#include"SPIPEMicroComm.h"
#endif
#include"I2CIPortComm.h"
#include"sapmem.h"
#include"SSTParams.h"
#ifdef_DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#defiene new DEBUG_NEW
#endif
#if 0
static int cmd_delay=1000;
static int io_delay=50;
#endif
#define FILE_VERSION 2 // file version
#define GAIN_SCALE 8.
// volume
#define VOLTOP 1.
#define VOLBOT 3.909e-6
#define VOLRANGE (VOLTOP-VOLBOT)
// hi and lo cutoff and shelving ranges
#define FLCTOPRANGE 0.149 // 1000/22050
#define FLCBOTRANGE 0.001769 // 10/22050
#define FLCRANGE (FLCTOPRANGE-FLCBOTRANGE)
#define FHCTOPRANGE 1 // 22050/22050
#define FHCBOTRANGE 0.63 // 8000/22050
#define FNCBOTRANGE2 0.42 // 4000/22050
#define FHCRANGE (FHCTOPRANGE-FHCBOTRANGE)
#define FHCRANGE2 (FHCTOPRANGE-FHCBOTRANGE2)
#define QLCTOPRANGE 1.0 // 1
#define QLCBOTRANGE 0.003891 // 0.001
#define QLCRANGE (QLCTOPRANGE-(QLCBOTRANGE))
#define SAMPLING_FREQ 44100
#define DELAY_LENGTH 128.
// convsrts frequency range to log scale
#define FTOPRANGE 1.
#define FBOTRANGE 0.134
#define FRANGE (FTOPRANGE-FBOTRANGE)
#define FTOPRANGE2 0.585 // about 2205 top.
#define FBDTRANGE2 3.531E-3
<dp n="d65"/>
// new ranges using actual frequencies
#define FTOPRANGE3 4.431 // 3000Hz
#define FBOTRANGE3 2.433 // 30Hz
// hi cutoff filter ranges
#define QHC2BOT 0.74
#define QHC2TOP 2.258
#define FHC2BOT 3.954 // 1000Hz
#define FHC2TOP 5.255 // 20kHz
#define FHCTOPRANGE3 5.13 // 15000
#define FHCBOTRANGE3 FHC2BOT
static char"m_ParamNames[kUIArraySize} = {"MainVolume",
"LoShelfFreq",
"LoShelfGain",
"HiShelfFreq",
"HiShelfGain",
"Notch1Freq",
"Notch1Q",
"Notch1Cut",
"Notch2Freq",
"Notch2Q",
"Notch2Cut",
"Notch3Freq",
"Notch3Q",
"Notch3Cut",
"Notch4Freq",
"Notch4Q",
"Notch4Cut",
"Notch5freq",
"Notch5Q",
"Notch5Cut",
"PreVolume",
"Bypass",
"LoCutoffFreq",
"LoCutoffQ",
"HiCutoffFreq",
"HiCutoffQ",
"HDCDBypass",
"HDCDGainScaleOff",
"DDXCompBypass",
"Notch6Freq",
"Notch6Q",
"Notch6Cut",
"Notch7Freq",
"Notch7Q",
"Notch7Cut",
"AnalogIn",
"AnalogVolume",
"Delay",
"AllpassFreq",
"AllpassQ",
"BypassMask",
"HiCutoff2Freq",
"HiCutoff2Q",
"Notch8Freq",
"Notch8Q",
"Notch8Cut",
"Notch9Freq",
"Notch9Q",
"Notch9Cut",
"NotchAFreq",
"NotchAQ",
"NotchACut",
"DBNotchWidth"};
//////////////////////////////////////////////////////////////////////
// SREC code
//////////////////////////////////////////////////////////////////////
<dp n="d66"/>
int CDSP56kManager::ChecksumSREC(char *lineptr,int N)
{
unsigned char curbyte,sum=0xff;
for(int x=2;x<N-2;x+=2)
{
sscanf(lineptr+x,"%2x",&curbyte);
sum-=curbyte;
}
// last one is checksum
sscanf(lineptr+x,"%2x",&curbyte);
return (curbyte==sum);
}
void CDSP56kManager::GetSRecordAddressRange(char *s,long"start, long"end,char"*data)
{
long address,count,soffset;
*start=-1L;
*end=-1L;
if(*s !=′S′) // not a srec
return;
// Let′s check the checksum for this line
ASSERT(ChecksumSREC(s,strlen(s)) );
switch(s[1])
{
case′1′:
soffset=8;
sscanf(&(s(4)),"%4x",&address);
break;
case′2′:
soffset=10;
sscanf(&(s[4]),"%6x",&address);
break;
case′3′:
soffset=12 ;
sscanf(&(s[4]),"%8x",&address);
break;
default:
return;
break;
}
count=strlen(s)-soffset-2;
*start=address;
"end=address+(count/6); // each word is 6 characters
*data=s+soffset;
}
void CDSP56kManager::DownloadDSPCode()
{
char **r=pmem;
int count=PRECORDS;
long start,end;
long ts,te;
char **recs;
char *srecdata,"td;
char *data,"dptr,*rdata,c;
long size,bsize;
long taddress,recstart,recend;
long value;
<dp n="d67"/>
// get starting and ending addresses
start = 0x7FFFFFFFL;
end=0;
recs=r;
for(int i=0;i <count;i++)
{
GetSRecordAddressRange(*recs++,&ts,&te,&srecdata);
if(ts<0L)continue;
start=min(start,ts);
end=max(end,te);
}
size=end-start;
bsize=size * 3;
rdata=(char *)malloc(bsize+6); // 3 bytes per word plus length and address
ASSERT(data !=NULL);
data=rdata+6;
dptr=data;
for(i=0 ;i<bsize;i++) // clear memory
*dptr++=0;
taddress=start;
while(taddress < end)
{
recstart=0x7FFFFFFFL;
recs=r;
for(int i=0;i<count;i++) // search for next address
{
GetSRecordAddressRange(*recs,&ts,&te,&td);
if(ts>=0L )
{
if(ts>=taddress)
{
if(ts<recstart)
{
recstart=ts;
recend=te;
srecdata=td;
}
}
}
recs++;
}
ASSERT(recstart<=end);
// copy record
dptr=data+((recstart-start)*3);
while(recstart !=recend)
{
sscanf(srecdata,"%2x",&value);
*dptr++=(char) value;
srecdata+=2;
sscanf(srecdata,"%2x",&value);
*dptr++=(char) value;
srecdata +=2;
sscanf(srecdata,"%2x",&value);
*dptr++=(char) value;
srecdata +=2;
recstart++;
}
taddress = recend;
}
// copy size and address
dptr=rdata;
c=(size>>16) & 0xFF;
*dptr++=c;
c=(size>>8) & 0xFF;
*dptr++=c;
c=size & 0xFF;
*dptr++=c;
c = (start >> 16)& 0xFF;
<dp n="d68"/>
*optr++=c;
c=(start>> 8)& 0xFF;
*dptr++=c;
c=start & 0xFF;
*dptr++=c;
// send data to DSP
// m_Comm->SendDSPWord(size);
// m_Comm->SendDSPWord(start);
m_Comm->SendDSPMemory(rdata,bsize+6);
free(rdata);
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CDSP56kManagsr[]CDSP56kManager(HWND p)
{
#if 0
if(load_dll()==false)
{
MessageBox(NULL,"UNIT_PPI not found in the system directory. Fix this and rectart application
Will Robinson",MB_OK | MB_ICONSTOP);
}
else
{
init_port_spi(1);
set_cmd_delay_cnt_value(cmd_delay);
set_io_delay_cnt_value(io_delay);
}
#endif
m_pi-acos(-1.);
m_Comm-new I2CIPortCommm(p);
// DownloadDSPCode();
int i;
for(i=0;i < kUIArraySize;i++)
{
m_Raw2DSFVals(i) =i;
}
m_Raw2DSPVals[kNotch6Freq]=kDSPNotch6Freq;
m_Raw2DSPVal=[kNotch6Q]=kDSPNotch6Q;
m_Raw2DSPVal=[kNotch7Cut]=kDSPNotch6Cut;
m_Raw2DSPVal=[kNotch7Freq]=kDSPNotch6Freq;
m_Raw2DSPVal=[kNotch7Q]=kDSPNotch7Q;
m_Raw2DSPVal=[kNotch7Cut]=kDSPNotch7Cut;
m_Raw2DSPVal=[kDelay]=kDSPDelay;
m_Raw2DSPVal=[kAllpassFreq]=kDSPAllpassFreq;
m_Raw2DSPVal=[kAllpassQ]=kDSPAllpassQ;
m_Raw2DSPVal=[kNotch8Freq]=kDSPNotch8Freq;
m_Raw2DSPVal=[kNotch8Q]=kDSPNotch8Q;
m_Raw2DSPVal=[kNotch8Cut]=kDSPNotch8Cut;
m_Raw2DSPVal=[kNotch9Freq]=kDSPNotch9Freq;
m_Raw2DSPVal=[kNotch9Q]=kDSPNotch9Q;
m_Raw2DSPVal=[kNotch9Cut]=kDSPNotch9Cut;
m_Raw2DSPVal=[kNotchAFreq]=kDSPNotchAFreq;
m_Raw2DSPVal=[kNotchAQ]=kDSPNotchAQ;
m_Raw2DSPVal=[kNotchACut]=kDSPNotchACut;
ResetAll();
<dp n="d69"/>
CDSP56kManager::-CDSP56kManager()
{
if(m_Comm)
delete m_Comm;
}
void CDSP56kManager::SetMainVolume(long value)
{
double fvalue;
if(value >= 0)
SetRawValue(value,kMainVolume);
if(m_RawVals[kMainVolume] == DSP_CONTROL_MAX)
m_DSPVals(kDSPMainVolume] = -m_RawVals(kMainVolume];
else if(m_RawVals(kMainVolume] == 0)
m_DSPVals[kDSPMainVolume]=0;
else
{
fvalue =m_RawVals[kMainVolume};
fvalue /=DSP_CONROL_MAX; // normalize
fvalue *=VOLRANGE;
fvalue +=VOLBOT;
fvalue =(pow(10.,fvalue)-1.}/(10.-1.);
fvalue *=DSP_CONTROL_MAX;
m_DSPVals[kDSPMainVolume] = (long) -fvalue;
}
SendDSPValue(kDSPMainVolume);
}
void CDSP56kManager::SendDSPValue(long which)
{
long value=m_DSPVals[which];
#if 0
// transmitted value has parameter value in top 16 bits and parameter identifier in 8 LSBs
value = (value & 0xFFFF00) | (which & 0xFF);
// m_DSPReturn=spi_xchng24(value);
m_DSPReturn=m Comm->SendDSPWord(value);
#endif
// changed protocol around to send index followed by data
char buffer[6];
buffer[0]=(which>>16) & 0xFF;
buffer[1]=(which>>8) & 0xFF;
buffer[2]=which & 0xFF;
buffer[3]=(value>>16) & 0xFF;
buffer[4]=(value>>8) & 0xFF;
buffer[5]=value & 0xFF;
m_DSPReturn=m_Comm->SendDSPMemory(buffer,6);
}
void CDSP56kManager::SetNotchFreq(long ivalue,long which)
{
double value;
int dspindex=m_Raw2DSPVals[which];
if(ivalue>=0)
SetRawValue(ivalue,which);
value=ConvertFreqRange(which);
value=-cos(m_pi*value);
value*=DSP_CONTROL_MAX;
m_DSPVals(dspindex)=(long) value;
<dp n="d70"/>
SendDSPValue(dspindex);
SetNotchQ(-1L,which+1,which);
}
#ifdef LEGACY
void CDSP56kManager::SetShelvFreq(long ivalue,long which)
{
double value,wc;
int dspindex=m_Raw2DSPVals[which];
if(ivalue>=0)
SetRawValue(ivalue,which);
value=ConvertFreqRange(which);
wc=m_pi*value;
value=(tan(wc/2)-1)/(tan(wc/2)+1);
value *=DSP_CONTROL_MAX;
m_DSPVals[dspindex]=(long) value;
SendDSPValue(dspindex);
}
#endif
void CDSP56kManager::SetNotchQ(long ivalue,long which,long rawfreq)
{
double beta,tbeta,q,wc;
int dspindex=m_Raw2DSPVals[which];
if(ivalue>= 0)
SetRawValue(ivalue,wich);
wc=ConvertFreqRange(rawfreq);
wc=m_pi*wc;
q=ConvertQRange(m_RawVals[which]);
tbeta=wc/(2*q);
if(tbeta>m_pi/4)
tbeta=m_pi/4;
beta=(1.-tan(tbeta))/(1.+tan(tbeta));
beta*=DSP_CONTROL_MAX;
m_DSPVals[dspindex]=(long)beta;
SendDSPValue(dspindex);
}
void CDSP56kManager::SetBoostCut(long ivalue,long which)
{
double value;
int dspindex=m_Raw2DSPVals[which];
if(ivalue>=0)
SetRawValue(ivalue,which);
value=ConvertBoostCutRange(m_RawVals[which]);
value=pow(10.,value);
value/=GAIN_SCALE;
value*=DSP_CONTROL_MAX;
m_DSPVals[dspindex]=(long)value;
SendDSPValue(dspindex);
}
void CDSP56kManager::SetShelv1Freq(long ivalue)
{
// SetShelvFreq(value,kLoShelfFreq);
double value,wc;
if(ivalue>=0)
SetRawValue(ivalue,kLoShelfFreq);
value=m_RawVals[kLoShelfFreq);
value/=DSP_CONTROL_MAX; // normalize
<dp n="d71"/>
value *= FLCRANGE;
value += FLCBOTRANGE;
value = (pow(10.,value) -1.)/(10.-1.);
wc = m_pi*value;
value = (tan(wc/2 )-1)/(tan(wc/2)+1);
value *= DSP_CONTROL_MAX;
m_DSPVals[kLoShelfFreq] = (long) value;
SendDSPValue(kLoShelfFreq);
}
void CDSP56kManager::SetShelv1Boost(long value)
{
SetBoostCut(value,kLoShelfGain);
}
void CDSP56kManager::SetShelv2Freq(long ivalue)
{
// SetShelvFreq(value,kHiShelfFreq);
double value,wc;
if(ivalue >= 0)
SetRaValue(ivalue,kHiShelfFreq);
value=m_RawVals[kHiShelfFreq];
value /=DSP_CONTROL_MAX; // normalize
value*=FHCRANGE2;
value +=FHCBOTRANGE2;
value=(pow(10.,value) -1.)/(10.-1.);
wc=m_pi*value;
value=(tan(wc/2)-1)/(tan(wc/2)+1);
value *=DSP_CONTROL_MAX;
m_DSPVals[kHiShelfFreq)=(long)value;
SendDSPValue(kHiShelfFreq);
}
void CDSP56kManager::SetShelv2Boost(long value)
{
SetBoostCut(value,kHiShelfGain);
}
void CDSP56kManager::SetNotchlFreq(long value)
{
SetNotchFreq(value,kNotch1Freq);
}
void CDSP56kManager::SetNotch1Q(long value)
{
SetNotchQ(value,kNotch1Q,kNotch1Freq);
}
void CDSP56kManager::SetNotch1Cut(long value)
{
SetBoostCut(value,kNotch1Cut);
}
void CDSP56kManager::SetNotch2Freq(long value)
{
SetNotchFreq(value,kNotch2Freq);
<dp n="d72"/>
void CDSP56kManager::SetNotch2Q(long value)
{
SetNotchQ(value,Notch2Q,kNotch2Freq);
}
void CDSP56kManager::SetNotch2Cut(long value)
{
SetBoostCut(value,kNotch2Cut);
}
void CDSP56kManager::SetNotch9Freq(long value)
{
double q,f,nf;
SetNotchFreq(Value,kNotch9Freq);
f=ConvertFreqRange(kNotch9Freq);
q=ConvertQRange(m_RawVals[kNotch9Q]);
nf=f-(f/(5,*q));
if(nf<0,)
nf=0,;
nf=pow(nf,0.5);
nf=log10((nf*(10.-1.))+1.);
nf-=FBOTRANGE;
nf/=(FTOPRANGE-FBOTRANGE);
nf*=DSP_CONTROL_MAX; // normalize
m_RawVals[kNotch8Freq] =(long) nf;
nf=f+(f/(5.*q));
if(nf>1.)
nf=1.;
nf=pow(nf,0.5);
nf=log10((nf * (10.-1.))+1.);
nf-=FBOTRANGE;
nf/=(FTOPRANGE-FBOTANGE);
nf*=DSP_CONTROL_MAX; // normalize
m_RawVals(kNotchAFreq]=(long)nf;
SetNotchFreq(-1L,kNotch8Freq);
SetNotchFreq(-1L,kNotchAFreq);
}
void CDSP56kManager::SetNotch3Freq(long value)
{
SetNotchFreq(value,kNotch3Freq);
m_RawVals[kNotch5Freq]=(m_RawVals[kNotch4Freq]+m_RawVals[kNotch3Freq)/2;
SetNotchFreq(-1L,kNotch5Freq);
}
void CDSP56kManager::SetNotch3Q(long value)
{
SetNotchQ(value,kNotch3Q,kNotch3Freq);
}
void CDSP56kManager::SetNotch3Cut(long value )
{
SetBoostCut(value,kNotch3Cut);
}
<dp n="d73"/>
void CDSP56kManaqer::SetNotch4Freq(long value)
{
SetNotchFreq(value,kNotch4Freq);
m_RawVals[kNotch5Freq] = (m_RawVals[kNotch4Freq] + m_RawVals[kNotch3Freg])/2;
SetNotchFreq(-1L,kNotch5Freq);
}
void CDSP56kManager::SetNotth4Q(long value)
{
SetNotchQ(value,kNotch4Q,kNotch4Freq);
}
void CDSP56kManager::SetNotch4Cut(long value)
{
SetBoostCut(value,kNotch4Cut);
}
void CDSP56kManager::SetNotchSQ(long value)
{
SetNotchQ(value,kNotch5Q,kNotch5Freq);
}
void CDSP56kManager[]SotNotch5Booat(long value)
{
SetBoostCut(value,kNotch5Cut);
}
double CDSP56kManager::DoConvertFreqRange(double val,doubls top,double bottom)
{
val /=DSP_CONTROL_MAX; // normalize
val *=top-bottom;
val +=bottom;
val =[pow(10.,val)-1.)/(10.-1.);
return(val);
}
double CDSP56kManager::ConvertFreqRange(int which)
{
double fval;
switch(which)
{
case kNotch1Freq:
case kNotch2Freq:
fval=DoConvertFreqRange(m_RawVals[which].FTOPRANGE3,FBORANGE3); // top frequency is 0.1 * Nyquis
t
fval /- SAMPLIG_FREQ/2;
break ;
default ;
fval=DoConvertFreqRange(m_RawVals[which],FTOPRANGE.FBOTRANGE];
// square log scale
fval=fval * fval;
break:
}
return(fval);
}
<dp n="d74"/>
// converts Q range to log scale
#define QTOPRANGE 2.258
#define QBOTRANGE 0.037
#define QRANGE(QTOPRANGE-QBOTRANGE)
double CDSP56kManager::ConvertQRange(long ival)
{
double val;
val=ival;
val /=DSP_CONTROL_MAX; // normalize
val *=QRANGE;
val +=QBOTRANGE;
val=(pow(10.,val)-1.)/(10.-1.);
return(val);
}
// converts input value to log gain value
//#define LOG8 0.9031
#define LOGGAINSCALE(log10(GAIN_SCALE))
double CDSP56kManager::ConvertBoostCutRange(long ival)
{
double val;
val=ival;
val /=DSP_CONTROL_MAX; // normalize
val=(2.*val*LOGGAINSCALE) - LOGGAINSCALE;
return(val);
}
void CDSP56kManager::SetRawValue(long value,long which)
{
if(value)
value +=1;
value <<=CONTROL_RANGE_SC;
m_RawVals[which]=value;
}
long CDSP56kManager::GetParamValue(long which)
{
long value;
if(which >=kUIArraySize)
value=0x400000L >>CONTROL_RANGE_SC;
else
value=m_RawVals[which] >>CONTROL_RANGE_SC;
value--;
if(value < 0)
value=0;
return(value);
}
void CDSP56kManager::SetParamValue(long value,long which)
{
switch(which)
{
case kHiCutoff2Freq:
SetHiCutoff2Freq(value);
break;
case kHiCutoff2Q:
SetHiCutoff2Q(value);
break;
case kHiCutoffFreq:
<dp n="d75"/>
SetHiCutoffFreq(value);
break;
case kHiCutoffQ:
SetHiCutoffQ(value);
break;
case kLoCutoffFreq:
SetLoCutoffFreq(value);
break;
case kLoCutoffQ:
SetLoCutoffQ(value);
break;
case kBypass:
SetBypass(value);
break;
case kDDXCompBypass:
SetDDXCompBypass(value);
break;
case kHDCDBypass:
SetHDCDBypass(value);
break;
case kHDCDGainScaleQff:
SetHDCDGainScale(value);
break;
case kAnalogVolume:
SetAnalogVolume(value);
break;
case kMainVolume:
SetMainVolume(value);
break;
case kPreVolume:
SetPreVolume(value);
break;
case kLoShelfFreq:
SetShelvlFreq(value);
break;
case kHiShelfFreq:
SetShelv2Freq(value);
break;
case kNotch8Cut:
SetBoostCut(value,which);
SetBoostCu(value,kNotchCut); // same value for both notches
break;
case kNotch1Cut;
case kNotch2Cut:
case kNotch3Cut:
case kNotch4Cut:
case kNotch5Cut:
case kNotch6Cut:
case kNotch7Cut:
case kLoShelfGain:
case kHiShelfGain:
SetBoostCut(value,which);
break;
case kNotch9Cut:
m_DSPVals[kDSPNotch9Cut]=0; // fixed notch
SendDSPValue(kDSPNotch9Cut);
break;
case kNotch3Freq:
SetNotch3Freq(value);
break;
case kNotch4Freq:
SetNotch4Freq(value);
break;
case kNotch9Freq:
SetNotch9Freq(value);
break;
case kNotch1Freq:
case kNotch2Freq:
case kNotch5Freq:
case kNotch6Freq:
case kNotch7Freq:
case kAllpaseFreq:
<dp n="d76"/>
SetNotchFreq(value,which);
break;
case kNotch8Q:
SetNotchQ(value.which,which-1);
SetNotchQ(value,kNotchAQ,kNotchAQ-1); // same value for both notches
break;
case kNotch9Q:
SetNotchQ(value,which,which-1);
SetNotch9Freq(-1) ;
break;
case kNotch1Q:
case kNotch2Q:
case kNotch3Q:
case kNotch4Q:
case kNotch5Q:
case kNotch6Q:
case kNotch7Q:
case kAllpassQ:
SetNotchQ(value,which,which-1);
break;
case kDelay:
SetDelay(value);
break;
// case kDBNotchWidth:
// SetDelay(value);
break;
case kNotch8Freq:
case kNotchAFreq:
case kNotchACut:
case kNotchAQ:
break;
}
}
void CDSP56kManager::SetDSPSettings(CStringArray & array)
{
int i;
CString string;
int index;
long value;
int fileversion=0:
int j=0;
double fvalue;
const char *sptr;
// reset all parameters
ResetAll();
// first check for comment at head
string=array.GetAt(0);
sptr=string;
if(strcmp(sptr,"# VERSION")==0)
{
string=array.GetAt(1);
sptr=string;
sscanf(sptr,"%d",&fileversion);
j=2;
}
for(i=j;i<array.GetSize();i++)
{
string=array.GetAt(i);
sptr=string;
if(sptr[0]==′#′)continue; // skip comments
sscanf(sptr,"%d\t0x%x",&index,&value);
if(index>=kUIArraySize)continue;
// Add any special treatment of parameters here
if(fileversion ==0L)
{
switch(index)
<dp n="d77"/>
{
case kNotch1Freq:
case kNotch2Freq:
fvalue=DoConvertFreqRange(value,FTOPRANGE,FBOTRANGE);
fvalue=fvalue * fvalue;
fvalue *=SAMPLING_FREQ/2 ;
fvalue=log10((fvalue * (10.-1.))+1.);
fvalue -= FBOTRANGE3;
fvalue /=(FTOPRANGE3-FBOTRANGE3);
if(fvalue > 1.0)
fvalue=1.0;
fvalue *=DSP_CONTROL_MAX; // normalize
value=(long)fvalue;
break;
// increased low frcquency
case kHiShelfFreq:
fvalue=DoConvertFreqRange(value,FHCTOPRANGE,FHCBOTRANGE);
fvalue=log10((fvalue* (10.-1.)) +1.);
fvalue -=FHCBOTRANGE2;
fvalue /=(FHCTOPRANGE-FHCBOTRANGE2);
if(fvalue > 1.0)
fvalue=1.0;
fvalue *= DSP_CONTROL_MAX: // normalize
value=(long) fvalue;
break;
case kHiCutoffFreq:
fvalue=DoConvertFreqRange(value,FHCTOPRANGE,FHCBOTRANGE);
fvalue*=SAMPLING_FREQ/2;
fvalue=log10((fvalue * (10.-1.))+1.);
fvalue-=FHCBOTRANGE3;
fvalue/=(FHCTOPRANGE3-FHCBOTRANGE3);
if(fvalue>1.0)
fvalue=1.0;
fvalue *=DSP_CONTROL_MAX; // normalize
value=(long) fvalue;
break;
}
}
else if(fileversion==1L)
{
switch(index)
{
case kNotch1Freq:
case kNotch2Freq:
fvalue=DoConvertFreqRange(value,FTOPRANGE2,FBOTRANGE2);
fvalue *=SAMPLING_FREQ/2;
fvalue=log10((fvalue *(10.-1.))+1.);
fvalue -=FBOTRANGE3;
fvalue /=(FTOPRANGE3-FBOTRANGE3);
if(fvalue>1.0)
fvalue=1.0;
fvalue *=DSP_CONTROL_MAX; // normalize
value=(long)fvalue;
break;
case kLoCutoffFreq:
fvalue=DoConvertFreqRange(value,FLCTOPRANGE,FLCBOTRANGE);
fvalue *=SAMPLING_FREQ/2;
fvalue=log10((fvalue *(10.-1.))+1.);
fvalue -=FLCBOTRANGE2;
fvalue /=(FLCTOPRANGE2-FLCBOTRANGE2);
if(fvalue>1.0)
fvalue=1.0;
fvalue*=DSP_CONTROL_MAX; // normalize
value=(long) fvalue;
break;
case kHiCutoff2Freq:
fvalue=DoConvertFreqRange(value,FTOPRANGE,FBOTRANGE);
fvalue *=SAMPLING_FREQ/2 ;
fvalue=log10((fvalue *(10.-1.))+ 1.);
fvalue *=FHC2BOT;
fvalue /=(FHC2TOP-FHC2BOT);
if(fvalue>1.0)
<dp n="d78"/>
fvalue=1.0;
fvalue *=DSP_CONTROL_MAX; // normalize
value=(long) fvalue;
break;
case kHiCutoffFreq:
fvalue=DoConvertFreqRange(value,FHCTOPRANGE,FHCBOTRANGE2);
fvalue *=SAMPLING_FREQ/2;
fvalue=log10((fvalue *(10.-1.))+1.);
fvalue -=FHCBOTRANGE3;
fvalue /=(FHCTOPRANGE3-FHCBOTRANGE3):
if(fvalue>1.0)
fvalue=1.0;
fvalue*=DSP_CONTROL_MAX; // normalize
value=(long) fvalue;
break;
}
}
m_RawVals(index) = value
}
// tell DSP of changes
for(i=0 ; i<kUIArraySize;i++)
{
SetParamValue(-1,i);;
}
m_DSPVals[kDSPBypassMakl = m_RawVals[kBypassMask];
SendDSPValue(DSPBypassMask);
}
void CDSP56kManager::GetDSPSettings(CStringArray & array)
{
char s{1000};
int i,index;
int j=0;
CString cstr;
// write header(so far only version number)
cstr="# VERSION";
array.SetAtGrow(j++,cstr);
sprintf(s,"%d",FILE_VERSION);
array.SetAtGrow(j++,s);
cstr="# DATA";
array.SetAtGrow(j++,cstr);
for(i=0;i<kUIArraySize;i++)
{
index=kUIArraySize-1-i;
if(index==kBypass)continue;
if(index==kHDCDBypass)continue;
if(index==kHDCDGainScaleOff)continue;
if(index==kAnalogIn)continue;
// MM 7/14/99 Added value in human readable form as comment
GetStringValue(index,cstr);
sprintf(s,"# %s %s",m_ParamNames[index],cstr);
array.SetAtGrow(j++,s);
sprintf(s,"%d\t0x%x",index,m_RawVals[index));
array.SetAtGrow(j++,s);
}
}
void CDSP56kManaqer::GetFilterBlob(CStringArray & array)
{
char s[1000];
int param;
int j=0;
CString cstr;
float v;
// write version number
<dp n="d79"/>
// cstr="# VERSION";
// array.SetAtGrow(j++.cstr);
sprintf(s,"%d".BLOB_FILE_VERSION);
array.SetAtGrow(j++,s);
// output delay
param=kDelay;
GetPureStringValue(param,cstr);
sscanf(cstr,"%f",&v);
if(v !=0.)
{
// cstr=m_ParamNames(param);
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_DELAY);
array.SetAtGrow(j++,s);
cstr="1";
array.SetAtGrow(j++.cstr);
GetPureStringValue(param.cstr);
array.SettGrow(j++,cstr);
}
// output pre-gain
param=kPreVolume;
// cstr=m_ParamNames[param];
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_GAIN);
array.SetAtGrow(j++,s);
cstr="1";
array.SetAtGrow(j++,cstr);
GetPureStringValueparam,cstr);
array.SetAtGrow(j++,cstr);
// lo-shelf
if(!GetBypassSection(kBypassLoshelf) )
{
// cstr="Low-Shelf";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_LS);
array.SetAtGrow(j++,s);
cstr="2";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kLoShelfFreq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kLoShelfGain,cstr);
array.SetAtGrow(j++,cstr);
}
// hi-shelf
if(!GetBypassSection(BypassHiShelf) )
{
// cstr="High-Shelf*;
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_HS);
array.SetAtGrow(j++,s );
cstr="2";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kHiShelfFreq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kHiShelfGain,cstr);
array.SetAtGrow(j++,cstr);
}
// low peaking cutoff
if( !GetBypassSection(kBypassHipae) )
{
// cstr="Low Cutoff";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_HP);
array.SetAtGrow(j++,s);
cstr="2":
array.SetAtGrow(j++,cstr);
GetPureStringValue(kLoCutoffFrcq,cstr);
<dp n="d80"/>
array.SetAtGrow(j++,cstr);
GetPureStringValue(kLoCutoffQ,cstr);
array.SetAtGrow(j++,cstr);
}
// high pcaking cutoff #1
if(!GetBypassSection(kBypassLopass) )
{
// cstr="High Cutoff";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_LP);
array.SetAtGrow(j++,s);
cstr="2";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kHiCutoffFreq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kHiCutoffQ,cstr);
array.SetAtGrow(j++,cstr);
}
// high peaking cutoff #2
if( !GetBypassSection(kBypassNLopass) )
{
// cstr="High Cutoff #2";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_LP2);
array.SetAtGrow(j++,s);
cstr="2";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kHiCutoff2Freq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kHiCutoff2Q,cstr);
array.SetAtGrow(j++,cstr);
}
// resonance comp #1
if(!GetBypassSection(kBypassNotch1) )
{
// cstr= "Parametric EQ";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_PEQ);
array.SetAtGrow(j++,s);
cstr="3";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch1Freq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch1Q,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch1Cut,cstr);
array.SetAtGrow(j++,cstr);
}
// resonance comp #2
if(!GetBypassSection(kBypassNotch2) )
{
// cstr="Parametric EQ";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_PEQ);
array.SetAtGrow(j++,s);
cstr ="3";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch2Freq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch2Q,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch2Cut,cstr);
array.SetAtGrow(j++,cstr);
}
// resonance comp #3
if( !GetBypassSection(kBypassNotch3) )
{
<dp n="d81"/>
// cstr="Parametric EQ";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_PEQ);
array.SetAtGrow(j++,s);
cstr="3";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch6Freq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch6Q,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch6Cut,cstr);
array.SetAtGrow(j++,cstr);
}
// resonance comp #4
if( !GetBypassSection(kBypassNotch4) )
{
// cstr="Parametric EQ";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_PEQ);
array.SetAtGrow(j++,s);
cstr ="3";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch7Freq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch7Q,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch7Cut,cstr);
array.SetAtGrow(j++,cstr);
}
// conecry
if ( !GetBypassSection(kBypassConecry) )
{
// cstr="Parametric EQ";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOC_PEQ);
array.SetAtGrow(j++,s);
cstr="3";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch3Freq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch3Q,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch3Cut,cstr);
array.SetAtGrow(j++,cstr);
// cstr="Parametric EQ";
// array.SetAtGrow(j++,cstr);
printf(s,"%d",BLOCK_PEQ);
array.SettGrow(j++,s);
cstr ="3";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch4Freq,cstr);
array.SetAtGrow (j++,cstr);
GetPureStringValue(kNotch4Q,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch4Cut,cstr);
array.SetAtGrow(j++,cstr);
// cstr= "Parametric EQ";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_PEQ);
array.SetAtGrow(j++,s);
cstr="3";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch5Freq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch5Q,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch5Cut,cstr);
array.SetAtGrow(j++,cstr);
<dp n="d82"/>
}
// allpass
if( !GetBypassSection(kBypassAllpass) )
{
// cstr= "Parametric EQ";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_AP);
array.SetAtGrow(j++,s);
cstr="2";
array.SetAtGrow(j++,cstr);
GetPureStringValue(AllpassFreq.cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kAllpassQ,cstr);
array.SetAtGrow(j++,cstr);
}
// double-tuned notch
if(!GetBypassSection(BypassDBNotch) )
{
// cstr="Parametric EQ";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_PEQ);
array.SetAtGrow(j++,s);
cstr="3";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch8Freq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch8Q,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch8Cut,cstr);
array.SetAtGrow(j++,cstr);
// cstr="Parametric EQ";
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_PEQ);
array.SetAtGrow(j++,s);
cstr="3";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch9Freq,cstr);
array.SettGrow(j++,cstr);
GetPureStringValue(kNotch9Q,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotch9Cut,cstr);
array.SetAtGrow(j++,cstr);
// cstr="Parametric EQ";
// array.SetGrow(j++,cstr);
sprintf(s,"%d",BLOCK_PEQ);
array.SetAtGrow(j++,s);
cstr ="3";
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotchAFreq,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotchAQ,cstr);
array.SetAtGrow(j++,cstr);
GetPureStringValue(kNotchACut,cstr);
array.SetAtGrow(j++,cstr);
}
// output post-gain
param=kMainVolume;
// cstr = m_ParamNames[param];
// array.SetAtGrow(j++,cstr);
sprintf(s,"%d",BLOCK_GAIN);
array.SetAtGrow(j++,s);
cstr="1";
array.SetAtGrow(j++,cstr);
Get PureStringValue(param,cstr);
array.SetAtGrow(j++,cstr);
<dp n="d83"/>
}
void CDSP56kManager::SetPreVolume(long value)
{
double fvalue;
if(value>=0)
SetRawValue(value,kPreVolume);
if(m_RawVals[kPreVolume] == DSP_CONTROL_MAX)
m_DSPVals[kDSPPreVolume] = -m_RawVals[kPreVolume];
else if(m_RawVals[kPreVolume]==0)
m_DSPVals[kDSPPreVolume]=0;
else
{
fvalue=m_RawVals[kPreVolume];
fvalue /=DSP_CONTROL_MAX; // normalize
fvalue *=VOLRANGE;
fvalue +=VOLBOT;
fvalue=(pow(10.,fvalue)-1.)/(10.-1.);
fvalue *=DSP_CONTROL_MAX;
m_DSPVals[kDSPPIeVolume] = (long) -fvalue;
}
SendDSPValue(kDSPPreVolume);
}
void CDSP56kManager::SetAnalogVolume(long value)
{
double fvalue;
if(value>=0)
SetRawValue(value,kAnalogVolume);
if(m_RawVals[kAnalogVolume] == DSP_CONTROL_MAX)
m_DSPVals[kDSPAnalogVol) = -m_RawVals[kAnalogVolume];
else if(m_RawVals[kAnalogVolume] == 0)
m_DSPVals[kDSPAnalogVol] = 0;
else
{
fvalue = m_RawVals[kAnalogVolume];
fvalue /=DSP_CONTROL_MAX; // normalize
fvalue *=VOLRANGE;
fvalue +=VOLBOT;
fvalue=(pow(10.,fvalue)-1.)/(10.-1.);
fvalue *=DSP_CONTROL_MAX;
m_DSPVals[kDSPAnalogVol] = (long) -fvalue;
}
SendDSPValue(kDSPAnalogVol);
}
void CDSP56kManager::SetBypass(long value)
{
if(value >=0 )
SetRawValue(value,kBypass);
if(m_RawVals[kBypass] )
m_DSPVals[kDSPBypass] = 0x7FFFFF;
else
m_DSPVals[kDSPBypass) = 0;
SendDSPValue(kDSPBypass);
}
void CDSP56kManager::SetLoCutoffFreq(long value)
{
if(value >=0)
SetRawValue(value,kLoCutoffFreq);
<dp n="d84"/>
SetLoCutoff():
}
void CDSP56kManager::SetLoCutoffQ(long value)
{
if(value >=0 )
SetRawValue(value,kLoCutoffQ);
SetLoCutoff();
}
void CDSP56kManager::SetHiCutoffFreq(long value)
{
if(value >=0)
SetRawValue(value,kHiCutoffFreq);
SetHiCutoff();
}
void CDSP56kManager::SetHiCutoffQ(long value)
{
if(value >=0 )
SetRawValue(value,kHiCutoffQ);
SetHiCutoff();
}
void CDSP56kManager::SetHiCutoff2Freq(long value )
{
if(value >= 0)
SetRawValue(value,kHiCutoff2Freq);
SetHiCutoff2();
}
void CDSP56kManager::SetHiCutoff2Q(long value)
{
if(value >= 0)
SetRawValue(value,kHiCutoff2Q);
SetHiCutoff2();
}
void CDSP56kManager::SetHiCutoff()
{
double f,q;
double a1,a2,b0;
q=m_RawVals[kHiCutoffQ];
q /=DSP_CONTROL_MAX; // normalize
q *= QLCRANGE;
q +=QLCBOTRANGE;
q=(pow(10..q)-1.)/(10.-1.);
if(q >=1.)
q=0.99999;
/*f = m_RawVals[kHiCutoffFreq];
f /= DSP_CONTROL_MAX; // normalize
f *= FHCRANGE2;
f += FHCBOTRANGE2;
f = (pow[10..f) -1.)/(10.-1.);*/
f = DoConvertFreqRange(m_RawVals[kHiCutoffFreq],FHCTOPRANGE3,FHCBOTRANGE3);
f /= SAMPLING_FREQ/2;
f = 2.*sin(f * m_pi/2.);
<dp n="d85"/>
a2=1.-f*q;
if(a2>=2.)
a2=1.99999;
else if(a2 <=-2.)
a2=-1.99999;
a1=-(2.-f*q-f*f);
if(a1>=2.)
a1=1.99999;
else if(al <=-2.)
a1=-1.99999;
b0=f*f/2.;
if(b0 >=8.)
b0=7.99999;
else if(b0 <=-8.)
b0=-7.99999;
m_DSPVals[kDSPHiCutoffA2]=(long)(a2*DSP_CONTROL_MAX/2.);
SendDSPValue(kDSPHiCutoffA2);
m_DSPVals[kDSPHiCutoffA1]=(long)(a1*DSP_CONTROL_MAX/2.);
SendDSPValue(kDSPHiCutoffA1);
m_DSPVals[kDSPHiCutoffScale]=(long)(b0*DSP_CONTROL_MAX/16.);
SendDSPValue(kDSPHiCutoffScale);
}
void CDSP56kManager::SetHiCutoff2()
{
doublef,q;
double a1,a2,b0;
double gamma,beta,lambda,alpha;
q=DSP_CONTROL_MAX-m_RawVals[kHiCutoff2Q];// invert scale
q/=DSP_CONTROL_MAX // normalize
q*=(QHC2TOP-QHC2BOT);
q+=QHC2BOT;
q=(pow(10.,q)-1.)/(10.-1.);
// f=ConvertFreqRange(kHiCutoff2Freq);
f=DoConvertFreqRange(m_RawVals[kHiCutoff2Freq],FHC2TOP,FHC2BOT);
f/=SAMPLING_FREQ/2;
gamma=-cos(f*m_pi);
beta=(1.-sin(f*m_pi/(2*q)))/(1.+sin(f*m_pi/(2*q)));
if(beta>2.0)
beta=2.0;
lambda=4.*beta*(gamma/(1.+beta));
if(lambda>2.0)
lambda=2.0;
alpha=1.+beta+lambda;
a2=beta;
a1=lambda;
b0=alpha/4.;
if(b0>=8.)
b0=7.99999;
else if(b0<=-8.)
b0=-7.99999;
m_DSPVals(kDSP2HiCutoffA2]=(long)(a2*DSP_CONTROL_MAX/2.);
SendDSPValue(kDSP2HiCutoffA2);
m_DSPVals[kDSP2HiCutoffA1]=(long)(a1 * DSP_CONTROL_MAX/2.);
SendDSPValue(kDSP2HiCutoffA1);
m_DSPVals(kDSP2HiCutoffScale)=(long)(b0 * DSP_CONTROL_MAX/16.);
SendDSPValue(kDSP2HiCutoffScale);
}
void CDSP56Manager::SetLoCutoff()
{
double f.q,scale_factor;
<dp n="d86"/>
q=m_RawVals(kLoCutoffQ];
q /=DSP_CONTROL_MAX; // nomalize
q *=QLCRANGE;
q *=QLCBOTRANGE;
q=(pow(10.,q)-1.)/(10.-1.);
if(q >=1.)
q=0.99999;
f=m_RawVals[kLoCutoffFreq);
f /* DSP_CONTROL_MAX; // normalize
f *=(FLCTOPRANGE2-FLCBOTRANGE2);
f +=FLCBOTRANGE2;
f=(pow)10.,f)-1.)/(10.-1.);
f /=SAMPLING_FREQ/2;
f=2.*sin(f*m_pi/2.);
if(f>=1.)
f=0.99999;
scale_factor=(4.-2.*f*q-f*f)/4.;
m_DSPVals[kDSPLoCutoffFc]=(long)(f * DSP_ONTROL_MAX);
SendDSPValue(kDSPLoCutoffFc);
m_DSPVals[kDSPLCutoffQc]=(long)(q * DSP_CONTROL_MAX);
SendDSPValue(kDSPLoCutoffQc);
m_DSPVals[kDSPLoCutoffffScale]=(long)(-0.5 * scale_factor * DSP_CONTOROL_MAX);
SendDSPValue(kDSPLoCutoffScale);
}
void CDSP56kManager::SetDDXCompBypass(long value)
{
if(value >=0)
SetRawValue(value,kDDXCompBypass);
if(m_RawVals[kDDXCompBypass])
m_DSPVals[kDSPDDXCompBypass]=0x7FFFFF;
else
m_DSPVals[kDSPDDXCompBypass]=0;
SendDSPValue[kDSPDDXCompBypass];
}
void CDSP56kManager::SetHDCDBypass(long value)
{
if(value >=0)
SetRawValue(value,kHDCDBypass);
if(m_RawVals[kHDCDBypass])
m_DSPVals[kDSPHDCDBypass]=0x7FFFFF;
else
m_DSPVals[kDSPHDCDBypass]=0;
SendDSPValue[kDSPHDCDBypass);
}
void CDSP56kManager::SetHDCDGainScale(long value)
{
if(value >=0)
SetRawValue(value,kHDCDGainScaleOff);
if(m_RawVals[kHDCDGainScaleOff] )
m_DSPVals[kDSPHDCDGainScaleOff]=0x7FFFFF;
else
m_DSPVals[kDSPHDCDGainScaleOff]=0;
SendDSPValue(kDSPHDCDGainScaleOff);
}
void CDSP56kManager::ResetAll()
{
<dp n="d87"/>
int i;
for(i=0;i<kUIArraySize:i++)
{
m_RawVals[i]=0x400000L;
}
for(i=0;i<kDSPArraySize;i++)
{
m_DSPVals[i]=0;
}
m_RawVals[kAnalogVolume]=0x800000L;
m_RawVals[kMainVolume]=0x800000L;
m_RawVals[kPreVolume]=0x800000L;
m_RawVals[kBypass]=0x000000L;
m_RawVals[kHDCDBypass]=0x000000L;
m_RawVals[kDDXComPBypass]=0x000000L;
m_RawVals[kHDCDGainScaleOff]=0x000000L;
m_RawVals[kAnalogIn]=0x000000L;
m_RawVals(kDelay]=0x000000L;
m_RawVals[kHiCutoff2Freq]=0x600000L;
m_RawVals[kHiCutoff2Q]=0x200000L;
m_RawVals[kHiCutoffFreq]=0x600000L;
m_RawVals[kHiCutoffQ]=0x200000L;
m_RawVals[kLoCutoffFreq]=0x40000L;
m_RawVals[kLoCutoffQ]=0x200000L;
m_DSPReturn=0;
for(i=0;i<kUIArraySize;i++)
{
SetParamValue(-1,i );
}
m_DSPVals[kDSPBypassMask]=m_RawVals(kBypasMask]=0L;
SendDSPValue(kDSPBypassMask);
}
void CDSP56kManager::SetNotch6Freq(long value)
{
SetNotchFreq(value,kNotch6Freq);
}
void CDSP56kManager::SetNotch6Q(long value)
{
SetNotchQ(value,kNotch6Q,kNotch6Freq);
}
void CDSP56kManager::SetNotch6Cut(long value)
{
SetBoostCut(value,kNotch6Cut);
}
void CDSP56kManager::SetNotch7Freq(long value)
{
SetNotchFreq(value,kNotch7Freq);
}
void CDSP56kManager:;SetNotch7Q(long value)
{
SetNotchQ(value,kNotch7Q,kNotch7Freq):
<dp n="d88"/>
}
void CDSP56kManager::SetNotch7Cut(long value)
{
SetBoostCut(value,kNotch7Cut);
}
int CDSP56kManager::GetHDCDMode()
{
// SetParumValue(-1,kMainVolume);
// return(m_DSPReturn);
return(m_Comm->GetDetectState() );
}
void CDSP56kManager::SetAnalogInput(long value)
{
if(value >=0)
SetRawValue(value,kAnalogIn);
if(m_Rawvals[knalogIn])
m_DSPVals[kDSPAnalogIn]=0x7FFFFF;
else
m_DSPVals[kDSPAnalogIn]=0;
SendDSPValue(kDSPAnalogIn);
}
BOOL CDSP56kManager::IsReady()
{
return(m_Comm->CheckState() );
}
void CDSP56kManager::GetPureStringValue(int which,CString &str)
{
int count;
GetStringValue(which,str);
str,TrimLeft();
count=str.Find(′ ′);
if(count >=0)
str=str.Left(count);
}
void CDSP56kManager::GetStringValue(int which,CString &str)
{
double value;
char s[100];
switch(which)
{
case kAnalogVolume:
case kMainVolume:
case kPreVolume:
value=m_RawVals[which];
value /=DSP_CONTROL_MAX;
value=20 * log10(value);
sprintf(s,"%10.2f dB",value);
str=s;
break;
case kHiCutoffFreq:
/* value=m_RawVls[which];
value /=DSP_CONTROL_MAX; // normalize
value*=FHCRANGE2;
<dp n="d89"/>
value +=FHCBOTRANGE2;
value=(pow(10.,value)-1.)/(10.-1.);
value *=SAMPLING_FREQ/2;*/
value=DoConvertFreqRange(m_RawVals(kHiCutoffFreq),FHCTOPRANGE3,FHCBOTRANGE3);
sprintf(s,"%10.2f Hz",value);
str=s;
break;
case kHiCutoff2Q:
value=DSP_CONTROL_MAX-m_RawVals[kHiCutoff2Q);
value /=DSP_CONTROL_MAX; // normalize
value *=QHC2TOP-QHC2BOT;
value +=QHC2BOT;
value=(pow(10.,value)-1.)/(10.-1.);
sprintf(s,"%10.2f",value);
str=s;
break;
case kHiCutoffQ:
value=m_RawVals[kHiCutoffQ];
value /=DSP_CONTROL_MAX; // normalize
value *=QLCRANGE;
value +=QLCBOTRANGE;
value=(pow(10.,value)-1.)/(10.-1.);
if(value >=1.)
value=0.99999;
sprintf(s,"%10.2f",value);
str=s;
break;
case kLoCutoffFreq:
value=mRawVals[kLoCutoffFreq];
value /=DSP_CONTROL_MAX; // normalize
value *=(FLCTOPRANGE2-FLCBOTRANGE2);
value +=FLCBOTRANGE2;
value=(pow(10.,value)-1.)/(10.-1.);
sprintf(s,"%10.2f Hz",value);
str=s;
break;
case kLoCutoffQ:
value=m_RawVals[kLoCutoffQ];
value /=DSP_CONTROL_MAX; // normalize
value +=QLCRANGE;
value +=QLCBOTRANGE;
value=(pow(10.,value)-1.)/(10.-1.);
if(value >=1.)
value=0.99999;
sprintf(s,"%10.2f",value);
str=s;
break;
case kLoShelfFreq:
value=m_RawVals[kLoShelfFreq];
value /=DSP_CONTROL_MAX; // normalize
value *=FLCRANGE;
value +=FLCBOTRANGE;
value=(pow(10.,value)-1.)/(10.-1.);
value *=SAMPLING_FREQ/2;
sprintf(s,"%10.2f Hz",value);
str=s;
break;
case kHiShelfFreq:
value=m_RawVals[kHiShelfFreq];
value /=DSP_CONTROL_MAX; // normalize
value *=FHCRANGE2;
value +=FHCBOTRANGE2;
value=(pow(10.,value)-1.)/(10.-1.):
value *=SAMPLING_FREQ/2;
sprintf(s."%10.2f Hz",value);
str=s;
break;
case kNotch1Cut:
case kNotch2Cut:
case kNotch3Cut:
case kNotch4Cut:
case kNotch5Cut:
<dp n="d90"/>
case kNotch6Cut:
case kNotch7Cut:
case kNotch8Cut:
case kNotch9Cut:
case kNotchACut:
case kLoShelfGain:
case kHiShelfGain:
value=20*ConvertBoostCutRange(m_RawVals[which]);
sprintf(s,"%10.2f dB",value);
str=s;
break;
case kNotch1Freq:
case kNotch2Freq:
case kNotch3Freq:
case kNotch4Freq:
case kNotch5Freq:
case kNotch6Freq:
case kNotch7Freq:
case kNotch8Freq:
case kNotch9Freq:
case kNotchAFreq:
case kAllpassFreq:
value=ConvertFreqRange(which);
value *=SAMPLING_FREQ/2;
sprintf(s,"%10.2f Hz",value);
str=s;
break;
case kHiCutoff2Freq:
value=DoConvertFreqRange(m_RawVals[kHiCutoff2Freq),FHC2TOP,FHC2BOT);
sprintf(s,"%10.2f Hz".value);
str=s;
break;
case kNotch1Q:
case kNotch2Q:
case kNotch3Q:
case kNotch4Q:
case kNotchSQ:
case kNotch6Q:
case kNotch7Q:
case kNotch8Q:
case kNotch9Q:
case kNotchAQ:
case kAllpassQ:
value=ConvertQRange(m_RawVals[which]);
sprintf(s,"%10.2f",value);
str=s:
break:
case kDelay:
value=m_RawVals[which];
value /=DSP_CONTROL_MAX;
value *=DELAY_LENGTH;
value /=SAMPLING_FREQ;
value *=1000.;
sprintf(s,"%10.2f mS",value);
str=s:
break;
default:
str="fixed";
break;
}
}
BOOL CDSP56kManager::IsBusy()
{
return(m_Comm->IsTransmitting());
}
void CDSP56kManager::SetBypassSection(BOOL value, int which)
{
<dp n="d91"/>
long mask=1L << which;
if(value)
{
m_RawVals[kBypassMask] |= mask;
}
else
{
mask=-mask;
m_RawVals[kBypassMask] &=mask;
}
m_DSPVals[kDSPBypassMask]=m_RawVals[kBypassMask];
SendDSPValue(kDSPBypassMask);
}
BOOL CDSP56kManager::GetBypassSection(int which)
{
long mask=1L << which;
return( (m_RawVals[kBypassMask] & mask) !=0);
}
void CDSP56kManager::SetDelay(long value)
{
if{value >=0)
SetRawValue(value,kDelay);
m_DSPVals[kDSPDelay]=m_Rawvals[kDelay];
SendDSPValue(kDSPDelay);
}
<dp n="d92"/>
// UI IDs
enum {
kMainVolume,
kLoShelfFreq,
kLoShelfGain,
kHiShelfFreq,
kHiShelfGain,
kNotch1Freq,
kNotch1Q,
kNotch1Cut,
kNotch2Freq,
kNotch2Q,
kNotch2Cut,
kNotch3Freq,
kNotch3Q,
kNotch3Cut,
kNotch4Freq,
kNotch4Q,
kNotch4Cut,
kNotch5Freq,
kNotch5Q,
kNotch5Cut,
kPreVolume,
kBypass,
kLoCutoffFreq,
kLoCutoffQ,
kHiCutoffFreq,
kHiCutoffQ,
kHDCDBypass,
kHDCDGainScaleOff,
kDDXCompBypass,
kNotch6Freq,
kNotch6Q,
kNotch6Cut,
kNotch7Freq,
kNotch7Q,
kNotch7Cut,
kAnalogIn,
kAnalogVolume,
kDelay,
kAllpassFreq,
kAllpassQ,
kBypassMask,
kHiCutoff2Freq,
kHiCutoff2Q,
kNotch8Freq,
kNotch8Q,
kNotch8Cut,
kNotch9Freq,
kNotch9Q,
kNotch9Cut,
kNotchAFreq,
kNotchAQ,
kNotchACut,
kDBNotchWidth
};
#define kUIArraySize (kDBNotchWidth+1)
// orphaned control IDs
/*
#define kNotch6Freq (10000+20)
#define kNotch6Q (10000+21)
#define kNotch6Boost (10000+22)
#define kNotch7Freq (10000+23)
#define kNotch7Q (10000+24)
#define kNotch7Boost (10000+25)
#define kLoShelf2Freq (10000+26)
#define kLoShelf2Boost (10000+27)
#define kHiShelf2Freq (10000+28)
#define kHiShelf2Boost (10000+29)
<dp n="d93"/>
*/
// DSP IDs
enum {
kDSPMainVolume,
kDSPLoShelfFreq,
kDSPLoShelfGain,
kDSPHiShelfFreq,
kDSPHiShelfGain,
kDSPNotch1Freq,
kDSPNotch1Q,
kDSPNotch1Cut,
kDSPNotch2Freq,
kDSPNotch2Q,
kDSPNotch2Cut,
kDSPNotch3Freq,
kDSPNotch3Q,
kDSPNotch3Cut,
kDSPNotch4Freq,
kDSPNotch4Q,
kDSPNotch4Cut,
kDSPNotch5Freq,
DSPNotch5Q,
kDSPNotch5Cut,
kDSPPreVolume,
kDSPBypass,
kDSPLoCutoffScale,
kDSPLoCutoffFc,
kDSPLoCutoffQc,
kDSPHiCutoffScale,
kDSPHiCutoffA2,
kDSPHiCutoffA1,
kDSPHDCDBypass,
kDSPHDCDGainScaleOff,
kDSPDDXCompBypass,
kDSPNotch6Freq,
kDSPNotcb6Q,
kDSPNotch6Cut,
kDSPNotch7Freq,
kDSPNotch7Q,
kDSPNotch7Cut,
kDSPAnalogIn,
kDSPAnalogVol,
kDSPBypassMask,
kDPDelay,
kDSPAllpassFreq,
kDSPAllpassQ,
kDSP2HiCutoffScale:
kDSP2HiCutoffA2,
kDSP2HiCutoffA1,
kDSPNotch8Freq,
kDSPNotch8Q,
kDSPNotch8Cut,
kDSPNotch9Freq,
kDSPNotch9Q,
kDSPNotch9Cut,
kDSPNotchAFreq,
kDSPNotchAQ,
kDSPNotchACut
};
#define kDSPArraySize(kDSPNotchACut+1)
// bit definitions for kDSPBypassMask above
enum {
kBypassNotch1,
kBypassNotch2,
kBypassNotch3,
kBypassNotch4,
kBypassHipass,
kBypassLpass,
kBypassLoshelf,
<dp n="d94"/>
kBypassHiShelf,
kBypassConecry,
kBypassAllpass,
kBypassDBNotch,
kBypassNLopass
};
<dp n="d95"/>
#if !defined(AFX_DBNOTCH_H__241CC3C5_14D9_11D3_96EE_006097CDB9E2__INCLUDED_)
#define AFX_DBNOTCH_H__241CC3C5_14D9_11D3_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif // _MSC_VER >= 1000
// DBNotch.h:header file
//
class CTabDialog;
/////////////////////////////////////////////////////////////////////////////
// CDBNotch dialog
class CDBNotch:public CPropertyPage
{
DECLARE_DYNCREATE(CDBNotch)
// Construction
public:
CDBNotch();
-CDBNotch();
// Dialog Data
//{{AFX_DATA(CDBNotch)
enum{IDD=IDD_PP11};
CButton m_Bypass;
CSliderCtrl m_CompGainSlider;
CSliderCtrl m_CompQSlider;
CSliderCtrl m_QSlider;
CSliderCtrl m_FreqSlider;
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CDBNotch).
Protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CDBNotch)
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
afx_msg void OnPaint();
virtual BOOL OnInitDialog();
afx_msg void OnBypass();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
CTabDialog *m_ParentWindow;
void SendStringToUI(int which);
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional deClarations immediately before the previous line.
#endif // !defined(AFX_DBNOTCH_H__241CC3C5_14D9_11D3_96EE_006097CDB9E2__INCLUDED_)
<dp n="d96"/>
// DBNotch.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"DBNotch.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] =__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDBNotch property page
IMPLEMENT_DYNCREATE(CDBNotch,CPropertyPage)
CDBNotch::CDBNotch() :CPropertyPage(CDBNotch;:IDD)
{
//{{AFX_DATA_INIT(CDBNotch)
// NOTE:the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
CDBNotch::-CDBNotch()
{
}
void CDBNotch::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AAX_DATA_MAP(CDBNotch)
DDX_Control(pDX,IDC_CHECK5,m_Bypass);
DDX_Control(pDX,IDC_SLIDER6,m_CompGainSlider);
DDX_Control(pDX,IDC_SLIDER5,m_CompQSlider);
DDX_Control(pDX,IDC_SLIDER2,m_QSlider);
DDX_Control(pDX,IDC_SLIDER1,m_FreqSlider);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDBNotch,CPropertyPage)
//{{AFX_MSG_MAP(CDBNotch)
ON_WM_VSCROLL()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_CHECKS,OnBypass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDBNotch message handlers
void CDBNotch::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
// TODO:Add your message handler code here and/or call default
CSliderCtrl *slider=(CSliderCtrl*)pScrollBar;
int which;
CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
Sleep(50);
if(slider==&m_FreqSlider)
which=kNotch9Freq;
else if(slider==&m_QSlider)
which=Notch9Q;
else if(slider==&m_CompQSlider)
which=kNotch8Q;
else if(slider==&m_CompGainSlider)
which=kNotch8Cut;
<dp n="d97"/>
else
return;
g_DSPManager->SetParamValue(CONTRoL_RANGE-slider->GetPos(),which);
SendStringToUI(which);
}
void CDBNotch::OnPaint()
{
CPaintDC dc(this);// device context for painting
// TODO:Add your message handler code here
m_FreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch9Freq));
m_QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch9Q));
m_CompQSlider.SetPosCONTROL_RANGE-g_DSPManager->GetParamValue(kNotch8Q));
m_CompGainSlider.SetPos(CONTrOL_RANGE-g_DSPManager->GetParamValue(kNotch8Cut)):
m_Bypass.SetCheck(g_DSPManager->GetBypassSection(kBypassDBNotch));
// Do not call CPropertyPage::OnPaint() for painting messages
}
BOOL CDBNotch::OnInitDialog()
{
CPropertyPage ::OnInitDialog();
// TODO:Add extra initialization here
m_FreqSlider.SetRange(0,CONTROL_RANGE);
m_FreqSlider.SetPos(CONTROL_RANGe-g_DSPManager->GetParamValue(kNotch9Freq));
m_FreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_QSlider.SetRange(0,CONTROL_RANGE);
m_QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch9Q));
m_QSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_CompQSlider.SetRange(0,CONTROL_RANGE);
m_CompQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch8Q));
m_CompQSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_CompGainslider.SetRange(0,CONTROL_RANGE);
m_CompGainSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch8Cut));
m_CompGainSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_ParentWindow=(CTabDialog*) GetParent()->GetParent();
return RUE;// return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CDBNotch::SendStringToUI(int which)
{
CString str;
g_DSPManager->GetStringValue(which,str);
m_ParentWindow->SetStatusString(0,str);
}
void CDBNotch::OnBypass()
{
// TODO:Add your control notification handler code here
int state=m_Bypass.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassDBNotch);
}
<dp n="d98"/>
// MainPage.cpp:implementation file
#include"TabDialog.h"
#include"DSP56kManager.h"
#include <stdlib.h>
#ifdef_DEBUG
#define new DEBUG_NEW
#undef 7HIS_FILE
static char THIS_FILE[]=__FILE__;
/////////////////////////////////////////////////////////////////////////////
// CMainPage property page
IMPLEMENT_DYNCREATE(CMainPage,CPropertyPage)
CMainPage::CMainPage():CPropertyPage(CMainPage::IDD)
{
//{{AFX_DATA_INIT(CMainPage)
m_ypassCheckBox=FALSE;
m_HDCDBypass=FALSE;
m_GainScaleBypass=FALSE;
m_AnalogInput=FALSE;
//}}AFX_DATA_INIT
}
CMainPage::-CMainPage()
{
}
void CMainPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CMainPage)
DDX_Control(pDX,IDC_SLIDER8,m_Delay);
DDX_Control(pDX,IDC_SLIDER7,m_AnalogVol);
DDX_Control(pDX,IDC_BUTTON1,m_ResetAll);
DDX_Control(pDX,IDC_SLIDER3,m_PreVolumeSlider);
DDX_Control(pDX,IDC_SLIDER1,m_VolumeSlider);
DDX_Check(pDX,IDC_CHECK1,m_BypassCheckBox);
DDX_Check(pDX,IDC_CHECK2,m_HDCDBypass);
DDX_Check(pDX,IDC_CHECK3,m_GainScaleBypass);
DDX_Check(pDX,IDC_CHECK4,m_AnalogInput);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE MAP(CMainPage,CPropertyPage)
//{{AFX_MSG_MAP(CMainPage)
ON_WM_VSCROLL()
ON_WM_SHOWWINDOW()
ON_BN_CLICKED(IDC_CHECK1,OnBypassButton)
ON_WM_PAINT()
ON_BN_CLICKED(IDC_CHECK2,OnHDCDBypass)
ON_BN_CLICKED(IDC_CHECK3,OnGainScaleBypass)
ON_BN_CLICKED(IDC_BUTTON1,OnResetAll)
ON_BN_CLICKED(IDC_CHECK4,OnAnalogInput)
//}}AFx_MSG_MAP
END_MESSAG_MAP()
/////////////////////////////////////////////////////////////////////////////
// CMainPage message handlers
void CMainPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
<dp n="d99"/>
{
// TODO:Add your message handler code here and/or call default
CSliderCtrl *slider=(CSliderCtrl*)pScrollBar;
int which;
CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
Sleep(50);
if(slider==&m_VolumeSlider)
which=kMainVolume;
else if(slider==&m_PreVolumeSlider)
which=kPreVolume;
else if(slider==&m_AnalogVol)
which=kAnalogVolume;
else if(slider==&m_Delay)
which=kDelay;
else
return;
g_DSPManager->SetParamValue(CONTROL_RANGE-slider->GetPos(),which);
SendStringToUI(which);
}
BOOL CMainPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO:Add extra initialization here
m_VolumeSlider.SetRange(0,CONTROL_RANGE);
m_VolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kMainVolume));
m_VolumeSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_VolumeSlider.SetPageSize(PG_CONTROL_AMT);
m_PreVolumeSlider.SetRange(0,CONTROL_RANGE);
m_PreVolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kPreVolume));
m_PreVolumeSlider.SetTicFreq((CONTROL RANGE+1)/16);
m_PreVolumeSlider.SetPageSize(PG_CONTROL_AMT);
m_AnalogVol.SetRange(0,CONTROL_RANGE);
m_AnalogVol.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAnalogVolume));
m_AnalogVol.SetTicFreq((CONTROL_RANGE+1)/16);
m_AnalogVol.SetPageSize(PG_CONTROL_AMT);
m_Delay.SetRange(0,CONTROL_RANGE);
m_Delay.SetPos(CONTROL_RANGE-g_DSPMnager->GetParamValue(kAnalogVolume));
m_Delay.SetTicFreq((CONTROL_RANGE+1)/16);
m_Delay.SetPageSize(PG_CONTROL_AMT);
m_BypassCheckBox=false;
m_ParentWindow=(CTabDialog *)GetParent()->GetParent();
return TRUE:// return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CMainPage::OnShowWindow(BOOL bShow,UINT nStatus)
{
CPropertyPage::OnShowWindow(bShow,nStatus);
// TODO:Add your message handler code here
}
void CMainPage::OnBypassButton()
{
// TODO:Add your control notification handler code here
m_BypassCheckBox= !m_BypassCheckBox;
g_DSPManager->SetBypass(m_BypassCheckBox);
}
void CMainPage::OnPaint()
<dp n="d100"/>
{
CPaintDc dc(this);// device context for painting
// TODO:Add your message handler code here
m_VolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetFaramValue(kMainVolume));
m_PreVolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kPreVolume));
m_AnalogVol.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kAnalogVolue));
m_Delay.SetPos(CONTROL_RaNCE-g_DSPManager-GetParamValuc(kDelay));
// Do not call CPropertyPage::OnPaint() for painting messages
}
void CMainPage::OnRDCDBypass()
{
// TODO:Add your control notification handler code here
m_HDCDBypass=!m_HDCDBypass;
g_DSPManager->SetHDCDBypass(m_HDCDBypass);
}
void CMainPage::OnGainScaleBypass()
{
// TODO:Add your control notification handler code here
m_GainScaleDypass=!m_GainScaleBypass;
g_DSPManager->SetHDCDGainScale(m_GainScaleBypass);
}
void CMainPage::OnResetAll()
{
// TODO:Add your control notification handler code here
// MM 8/3/99 Added extra dialog warning.
if(MessageBox("Are you sure you want to reset all parameters?","WARNING*,MB_YESNO) !=IDYES)
return;
g_DSPManager->ResetAll();
m_VolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kMainVolume));
m_PreVolumeSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kPreVolume));
m_AnalogVol.SetPos[CONTROL_RANGE-g_DSPManager->GetParamValue(kAnalogVolume));
m_Delay.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kDelay));
}
void CMainPage::OnAnalogInput()
{
// TODO;Add your control notification handler code here
m_AnalogInput=!m_AnalogInput;
g_DSPManager->SetAnalogInput(m_AnalogInpit);
}
void CMainPage::SendStringToUI(int which)
{
CString str;
g_DSPManager->GetStringValue(which,str);
m_ParentWindow->SetStatusString(0,str);
}
<dp n="d101"/>
#if !defined(AFX_MAINPAGE_H_90463DA4_D52E_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_MAINPAGE_H_90463DA4_D52E_11D2_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif
//_MSC_VER >=1000
// MainPage.h:header file
//
class CTabDialog;
/////////////////////////////////////////////////////////////////////////////
// CMainPage dialog
class CMainPage:public CPropertyPage
{
DECLARE_DYNCREATE(CMainPage)
// Construction
public:
CMainPage();
-CMainPage();
// Dialog Data
//{{AFX_DATA(CMainPage)
enum {IDD=IDD_PP2};
CSliderCtrl m_Delay;
CSliderCtrl m_AnalogVol;
CButton m_ResetAll;
CSliderCtrl m_PreVolumeSlider;
CSliderCtrl m_VolumeSlider;
BOOL m_BypassCheckBox;
BOOL m_HDCDBypass;
BOOL m_GainScaleBypass;
BOOL m_AualogInput;
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CMainPage)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CMainPage)
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
virtual BOOL OnInitDialog();
afx_msg void OnShowWindow(BOOL bShow,UINT nStatus);
afx_msg void OnBypassButton();
afx_msg void OnPaint();
afx_msg void OnHDCDBypass();
afx_msg void OnGainScaleBypass();
afx_msg void OnResetAll();
afx_msg void OnAnalogInput();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
CTabDialog *m_ParentWindow;
void SendStringToUI(int which);
private:
};
//{{AFX_INSERT_LOCATION}}
<dp n="d102"/>
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_MAINPAGE_H_90463DA4_D52E_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d103"/>
// I2CIPortComm.h;interface for the I2CIPortComm class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_I2CIPORTCOMM_H__33F9EF07_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_I2CIPORTCOMM_H__33F9EF07_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_
#if _MSC_VER >=1000
#pragma once
#endif //_MSC_VER >=1000
#include"DSPComm.h"
enum{
MI2C_STATE_CLOSED,
MI2C_STATE_PENDING_OPEN,
MI2C_STATE_OPEN,
MI2C_STATE_PENDING_TX,
MI2C_STATE_PENDING_RX
};
#define MI2_BUFFER_SIZE(3*3000) // should be multiple of 3
class I2CIPortComm:public DSPComm
{
int m_state;
int m_error_code;
long m_TxReq;
char m_tx_buffer[MI2_BUFFER_SIZE];
long m_tx_write,m_tx_read;
long m_detect;
BOOL m_get_detect;
long m_retryCount;
BOOL m_initialTry;
HWND m_HWnd;
public:
virtual BOOL IsTransmitting(void);
virtual long GetDetectState(void);
virtual void MessageHandler(WPARAM iPortEventCode);
virtual BOOL CheckState(void);
I2CIPortComm(HWND p);
virtual-I2CIPortComm();
virtual long SendDSPWord(long);
virtual long SendDSPMemory(char *,long);
};
#endif // !defined(AFX_I2CIPORTCOMM_H__33F9EF07_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d104"/>
// I2CIPortComm.cpp:implementation of the I2CIPortComm class.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"sa.h"
#include"I2CIPortComm.h"
#include"COMPortChooser.h"
#include"i2c200.h"
static struct I2C_PROP i2c;
static I2CIPortComm *g_I2CComm=NULL;
#define I2C_SLAVE_ADDRESS 0xs0
#define I2C_MAX_AMOUNT(5*3) // don′t send more than this in one-shot
#define I2C_RETrY_COUNT 0
#ifdef_DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//static int cb_message;
void iPortMsgHandler(WPARAM iPortEventCode)
{
if(g_I2CComm)
g_I2CComm->MessageHandler(iPortEventCode);
}
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
/*static BOOL wait_for_message(void)
{
long count;
while(cb_message==-1)
{
Sleep (100);
count++;
if(count>20)
return(false);
}
return(true);
}*/
I2CIPortComm::I2CIPortComm(HWND p)
{
int r;
CCOMPortChooser dlg;
dlg.DoModal();
m_error_code=0;
m_state=MI2C_STATE_CLOSED;
m_TxReq=0;
m_tx write=m_tx_read=0;
m_detect=0;
m_get_detect=false;
m_initialTry=false;
m_HWnd=p;
i2c.comport=dlg.which_port;
<dp n="d105"/>
i2c.WmMsgNo=0;
i2c.pfCBF=iPortMsgHandler;
#ifdef NDEBUG
i2c.pcLogFileName=NULL;
#else
i2c.pcLogFileName="log.txt";
#endif
i2c.LogFileLevel=1;
i2c.LogFileSize=1000;
i2c.HostSlaveAddr=0x6E;
i2c.BusTimeOut=1000;
i2c.MasterBitRate=2; // 100kHz
i2c.MasterRxBufSize=512;
i2c.MasterTxBufSize=MI2_BUFFER_SIZE;
i2c.MasterArbRetry=0;
i2c.SlaveRxGCEnable=1;
i2c.SlaveRxBufSize=512;
i2c.SlaveTxBufSize=512;
r=I2COpen(m_HWnd,AfxGetInstanceHandle(),&i2c);
if(r)
m_error_code=0x1000;
m_state=MI2C_STATE_PENDING_OPEN;
g_I2CComm=this;
}
I2CIPortComm::-I2CIPortComm()
{
I2CClose();
g_I2CComm=NULL;
}
long I2CIPortComm::SendDSPWord(long value)
{
char buffer[3];
if(m_state<MI2C_STATE_OPEN)
return(0L);
buffer[0]=(value >> 16)& 0xFF;
buffer[1]=(value >> 8)& 0xFF;
buffer[2]=value & 0xFF;
return(SendDSPMemory(buffer,3) );
}
long I2CIPortComm::SendDSPMemory(char"data,long len)
{
// make sure the link is valid
if(m_state < MI2C_STATE_OPEN)
return(0L);
long rval=0L;
long b;
long tocopy,amount,freespace;
// copy data into the tx buffer
if(data )
{
freespace=m_tx_read-m_tx_write;
if(freespace <= 0)
freespace +=MI2_BUFFER_SIZE;
ASSERT((len+3) <= freespace);// not enough space in the buffer
for(tocopy=len;tocopy >0;tocopy -=amount)
{
if(m_tx_write >=m_tx_read)
{
<dp n="d106"/>
amount=MI2_BUFFER_SIZE-m_tx_write;
}
else
{
amount=m_tx_read-m_tx_write;
}
amount=min(amount.tocopy);
memcpy(m_tx_buffer+m_tx_write.data.amount);
data +=amount;
m_tx_write +=amount;
m_tx_write %=MI2_BUFFER_SIZE;
}
}
// attempt to send it
if(m_state==MI2C_STATE_OPEN)
{
amount=m_tx_write - m_tx_read;
// ASSERT(amount==((amount/3)*3));
if(amount <0)
amount=MI2_BUFFER_SIZE-m_tx_read;
// amount=(amount/3) *3; // Send complete DSP Words.
amount=min(amount.I2C_MAX_AMOUNT); // throttle
b=I2CMasterTx(I2C_SLAVE_ADDRESS.(unsigned char *)m_tx_buffer+m_t_read.amount,1);
if(b==0)
{
m_state=MI2C_STATE_PENDING_TX;
m_TxReq=amount;
if((im_initialTry)
{
m_retryCount=0;
m_initialTry=true;
}
}
else
{
if(m_error_code==0)
m_error_code=b;
ASSERT(b==0);
}
}
return(rval);
}
void I2CIPortComm::MessageHandler(WPARAM iPortEventCode)
{
struct I2C_PROP si2c;
int r;
long tx_count;
long val;
unsigned char buffer[10];
switch(m_state)
{
case MI2C_STATE_PENDING_OPEN:
if(iPortEventCode==I2C_OPEN_SUCCESSFUL)
{
m_state=MI2C_STATE_OPEN;
if(m_tx_read !=m_tx_write)
SendDSPMemory(NULL.0L);
}
else
m_error_code=iPortEventCode;
break;
case MI2C_STATE_PENDING_RX:
if(iPortEventCode==I2C_MRX_COMPLETE)
{
r=I2CGctMasterRxMsg(3.buffer);
if(r==3)
<dp n="d107"/>
val=buffer[0] & 0xFF;
val <<8;
val=val |(buffer[1]& 0xFF);
val <<8;
val=val |(buffer[2] & 0xFF);
m_detect=val;
}
}
//else
// m_error_code=iPortEventCode;
m_state=MI2C_STATE_OPEN;
if(m_tx_read !=m_tx_write)
SendDSPMemory(NULL.0L);
break;
case MI2C_STATE_PENDING_TX:
if(iPortEventCode==I2C_MTX_COMPLETE)
{
// MM 5/20/99 Don′t call status here.
// r=I2CGetStatus(&si2c);// tx_count=si2c.MasterTxByteCount;
tx_count=m_TxReq;
m_initialTry=false;
}
else
{
m_retryCount++;
if(m_retryCount > I2C_RETRY_COUNT)
(
m_initialTry=false;
if(m_error_code==0)
m_error_code=iPortEventCode;
//ASSERT(m_retryCount <=I2C_RETRY_COUNT);
I2CClose();
r=I2COpen(m_HWnd.AfxGetInstanceHandle(),&i2c);
ASSERT(r==0);
m_state=MI2C_STATE_PENDING_OPEN;
return;
}
tx_count=0;
}
m_state=MI2C_STATE_OPEN;
m_tx_read +=tx_count;
m_tx_read %=MI2_BUFFER_SIZE;
if(m_get_detect)
{
m_get_detect=false;
r=I2CMasterRxExt(I2C_SLAVE_ADDRESS,3.1.1);
if(r)
{
if(m_error_code==0 )
m_error_code=r;
}
else
m_state=MI2C_STATE_PENDING_RX;
}
else if(m_tx_read !=m_tx_write)
SendDSPMemory(NULL.0L);
break;
/* case MI2C_STATE_PENDING_TX;
if(iPortEventCode==I2C_MTX_COMPLETE)
{
r=I2CGetStatus(&si2c);
if(m_TxReq==si2c.MasterTxByteCount)
{
m_state=MI2C_STATE_OPEN;
m_tx_read +=m_TxReq;
m_tx_read %=MI2_BUFFER_SIZE;
if(m_tx_read !=m_tx_write)
SendDSPMemory(NULL.0L);
<dp n="d108"/>
}
}
else
{
m_error_code=iPortEventCode;
;m_tx_read=m_tx_write=0;
m_state=MI2C_STATE_OPEN;
if(m_tx_read !=m_tx_write)
SendDSPMemory(NULL.0L);
}
break;*/
}
}
BOOL I2CIPortComm::CheckState()
{
return(m_state==MI2C_STATE_OPEN);
}
long I2CIPortComm::GetDetectState()
{
long r.rval=0;
if(m_error_code)
{
rval=-m_error_code;
m_error_code=0;
}
else
{
rval=(m_detect)?1:0;
}
/*if(m_state==MI2C_STATE_PENDING_TX)
m_get_detect=true;
else if(m_state==MI2C_STATE_OPEN)
{
r=I2CMasterRxExt(I2C_SLAVE_ADDRESS,3,1,1);
if(r)
m_error_code=r;
else
m_state=MI2C_STATE_PENDING_RX;
}*/
return(rval);
}
BOOL I2CIPortComm;:IsTransmitting()
{
return(m_tx_write !=m_tx_read);
}
<dp n="d109"/>
#if !defined(AFX_I2CDIALOG_H__B5D510E6_F7D5_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_I2CDIALOG_H__B5D510E6_F7D5_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER>=1000
#pragma once
#endif // _MSC_VER >=1000
// I2CDialog.h :header file
//
/////////////////////////////////////////////////////////////////////////////
// CI2CDialog dialog
class CI2CDialog:public CDialog
{
UINT m_timerID;
int m_state;
// Construction
public:
CI2CDialog(CWnd* pParent=NULL); // standard constructor
// Dialog Data
//{{AFX_DATA(CI2CDialog)
enum(IDD=IDD_DIALOG2);
// NOTE:the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CI2CDialog)
public:
virtual BOOL OnCmdMsg(UINT nID,int nCode,void* pExtra,AFX_CMDHANDLERINFO* pHandlerInfo);
protected:virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CI2CDialog)
virtual BOOL OnInitDialog();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnClose();
//)}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft DeveloperStudio willinsert additional declarations immediately before the provlous line.
#endif // !defined(AFX_I2CDIALOG_H__B5D510E6_F7D5_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d110"/>
// I2CDialog.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include "I2CDialog.h"
#include"DSP56kManager.h"
#define TIMERID 55
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] =__FILE__:
#endif
/////////////////////////////////////////////////////////////////////////////
// CI2CDialog dialog
CI2CDialog::CI2CDialog(CWnd* pParent /*=NULL*/)
:CDialog(CI2CDialog::IDD,pParent)
{
//{{AFX_DATA_INIT(CI2CDialog)
//NOTE:the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
}
void CI2CDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CI2CDialog)
//NOTE:the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CI2CDialog,CDialog)
//{{AFX_MSG_MAP(CI2CDialog)
ON_WM_TIMER()
ON_WM_CLOSE()
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CI2CDialog message handlers
BOOL CI2CDialog::OnInitDialog()
{
CDialog::OnInitDialog();
// TODO:Add extra initialization here
g_DSPManager=new CDSP56kManager(this->m_hWnd);
m_timerID=0;
m_timerID=SetTimer(TIMERID,50,NULL);
m_state=0;
return TRUE:// return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CI2CDialog::OnTimer(UINT nIDEvent)
{
// TODO:Add your message handler code here and/or call default
if(nIDEvent==TIMERID)
{
if(g_DSPManager->IsReady())
{
switch(m_state)
<dp n="d111"/>
`
case 0 :
g_DSPManager->DownloadDSPCode();
m_state++;
break:
case 1:
g_DSPManager->ResetAll();
EndDialog(IDOK);
break;
default:
EndDialog(IDOK);
break;
}
}
else if(g_DSPMananager->GetHDCDMode() < 0)
EndDialog(IDABORT);
}
else
{
CDialog::OnTimer(nIDEvent);
}
}
BOOL CI2CDialog::OnCmdMsg(UINT nID,int nCode,void* pExtra,AFX_CMDHANDLERINFO* pHandlerInfo)
// TODO:Add your specialized code here and/or call the base class
return CDialog::OnCmdMsg(nID,nCode,pExtra,pHandlerInfo);
}
void CI2CDialog::OnClose()
{
// TODO:Add your message handler code here and/or call default
if(m_timerID)
KillTimer(m_timrID);
CDialog::OnClose();.
}
<dp n="d112"/>
#if !defined(AFX_I2CCOMMERRORDIALOG_H__76C389E8_F889_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_I2CCOMMERRORDIALOG_H__76C389E8_F889_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif // _MSC_VER >=1000
// I2CCommErrorDialog.h:header file
//
/////////////////////////////////////////////////////////////////////////////
// CI2CCommErrorDialog dialog
class CI2CCommErrorDialog:public CDialog
{
// Construction
public:
CI2CCommErrorDialog[CWnd* pParent=NULL);// standard constructor
// Dialog Data
//{{AFX_DATA(CI2CCommErrorDialog)
enum{IDD=IDD_DIALOG4};
CString m_ErrorCode;
//}}AFX_DATA
// Overrides
// ClaseWizard generated virtual function overrides
//((AFX_VIRTUAL(CI2CCommErrorDialog)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CI2CCommErrorDialog)
afx_msg void OnButton1();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
} ;
//[{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif //!defined(AFX_I2CCOMMERRORDIALOG_H_76C389E8_F889_11D2_96EE_006097CDE9E2__INCLUDED_)
<dp n="d113"/>
// I2CCommErrorDialog.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"I2CCommErrorDialog.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CI2CCommErrorDialog dialog
CI2CCommErrorDialog::CI2CCommErrorDialog(CWnd* pParent /*=NULL*/)
:CDialog(CI2CCommErrorDialog::IDD,pParent)
{
//{{AFX_DATA_INIT(CI2CCommErrorDialog)
m_ErrorCode=_T("");
//}}AFX_DATA_INIT
}
void CI2CCommErrorDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CI2CCommErrorDialog)
DDX_Text(pDX,IDC_EDITl,m_ErrorCode);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CI2CCommErrorDialog,CDialog)
//{{AFX_MSG_MAP(CI2CCommErrorDialog)
ON_BN_CLICKED(IDC_BUTTON1,onButton1)
//}},AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CI2CCommErrorDialog message handlers
void CI2CCommErrorDialog::OnButton1()
{
// TODO:Add your control notification handler code here
EndDialog(IDCANCEL);
}
<dp n="d114"/>
// PEQParam.h:interface for the CPEQParam class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_PEQPARAM_H__733FB7AB_4A49_11D3_96EE_006097CDB9E2__INCLUDED_)
#define AFX_PEQPARM_H_733FB7AB_4A49_11D3_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif //_MSC_VER >=1000
typedef struct_biquadcoef
{
float c[6];// b0,b1,b2,a0,a1,a2
} biquadcoef;
class CPEQParam
{
float m_Gain; // in dB(+or-)
float m_Q; // in Q units
float m_Frequency; // in Hz
float m_SampleRate; // in Hz
double m_pi;
public:
void GetCoef(biquadcoef *);
void GetAllpassCoef(biquadcoef *);
void SetQ(floatv){m_Q=v;}
void SetQ(CString &str);
void SetGain(float v){m_Gain=v;}
void SetGain(CString &str);
void SetFreq(float v){m_Frequency=v;}
void SetFreq(CString &str);
CPEQParam();
virtual_CPEQParam();
};
#endif // !defined(AFX PEQPARAM_H__733FB7AB_4A49_11D3_96EE_0006097CDB9E2_INCLUDED_)
<dp n="d115"/>
// PEQParam.cpp:implementation of the CPEQParam class.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"sa.h"
#include"PEQParam.h"
#include<stdio.h>
#include<math.h>
#ifdef_DEBUG
#undef THIS_FILE
static char THIS_FILE[]=_FILE_;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CPEQParam::CPEQParam()
:m_Frequency(0.5),m_Gain(0.0),m_Q(1.0),m_SampleRate(44100.)
{
m_pi=acos(-1.);
}
CPEQParam::-CPEQParam()
{
}
void CPEQParam::SetGain(CString & str)
{
float v;
sscanf(str,"%f",&v);
m_Gain=v;
}
void CPEQParam::SetFreq(CString & str)
{
float v;
sscanf(str,"%f",&v);
m_Frequency=v;
}
void CPEQParam::SetQ(CString & str)
{
float v;
sscanf(str,"%f",&v);
m_Q=v;
}
void CPEQParam::GetAllpassCoef(biquadcoef *f)
{
double gamma,beta,wc,tbeta;
double normFreq=m_Frequency/m_SampleRate;
wc=m_pi*normFreq;
gamma=-cos(wc);
tbeta=wc/(2*m_Q);
if(tbeta>m_pi/4)
tbeta=m_pi/4;
beta=(1.-tan(tbeta))/(1.+tan(tbeta));
f->c[0]=(float)beta; // b0
<dp n="d116"/>
f->c[1]=(float)(gamma*(1+beta));// b1
f->c[2]=1.; // b2
f->c[3]=1.; // a0
f->c[4]=f->c[1]; // a1
f->c[5]=(float)beta; // a2
}
void CPEQParam::GetCoef(biquadcoef *f)
{
double M,L;
biquadcoef af;
double gain=(float) pow[10.,m_Gain/20.);
GetAllpassCoef(&af);
M=(1.-gain)/2.;
L=(1.+gain)/2.;
f->c[0]=(float)(af.c[0]*M+L); // b0
f->c[1]=(float)(af.c[1]*M+af.c[4]*L); // b1
f->c[2]=[float)(af.c[2]*M+af.c[5]*L); // b2
f->c[3]=af.c[3];
f->c[4]=af.c[4];
f->c[5]=af.c[5];
}
<dp n="d117"/>
#if !defined(AFX_NOTCHPAGE2_H__5C8994C7_E2A4_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_NOTCHPAGE2_H__5C8994C7_E2A4_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif //_MSC_VER >=1000
// NotchPage2.h :header file
//
class CTabDialog;
/////////////////////////////////////////////////////////////////////////////
// CNotchPage2 dialog
class CNotchPage2:public CPropertyPage
{
DECLARE_DYNCREATE(CNotchPage2)
// Construction
public:
CNotchPage2();
-CNotchPage2();
// Dialog Data
//{{AFX_DATA(CNotchPage2)
enum{IDD=IDD_PP9};
CButton m_BypassSecondButton;
CButton m_BypassFirstButton;
CSliderCtrl m_SliderCut4;
CSliderCtrl m_SliderQ4;
CSliderCtrl m_SliderFrequency4;
CSliderCtrl m_SliderCut3;
CSliderCtrl m_SliderQ3;
CSliderCtrl m_SliderFrequency3;
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CNotchPage2)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CNotchPage2)
afx_msg void OnPaint();
virtual BOOL OnInitDialog();
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
afx_msg void OnBypassFirst();
afx_msg void OnBypassSecond();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
CTabDialog *m_ParentWindow;
void SendStringToUI(int which);
};
//{{AFX_INSERT_LOCATION}}
//Microsoft Developer Studiowill insertadditional declarations immediately before the previous line.
#endif //!defined(AFX_OTCHPAGE2_H__5C8994C7_E2A4_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d118"/>
// NotchPage2.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"NotchPage2.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNotchPage2 property page
IMPLEMENT_DYNCREATE(CNotchPage2,CPropertyPage)
CNotchPage2::CNotchPage2():CPropertyPage(CNotchPage2::IDD)
{
//{{AFX_DATA_INIT(CNotchPage2)
//}}AFX_DATA_INIT
}
CNotchPage2::-CNotchPage2()
{
}
void CNotchPage2::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNotchPage2)
DDX_Control(pDX,IDC_CHECK6,m_BypassSecondButton);
DDX_Control(pDX,IDC_CHECK5,m_BypassFirstButton);
DDX_Control(pDX,IDC_SLIDER6,m_SliderCut4);
DDX_Control(pDX,IDC_SLIDER5,m_SliderQ4);
DDX_Control(pDX,IDC_SLIDER4,m_SliderFrequency4);
DDX_Control(pDX,IDC_SLIDER3,m_SliderCut3);
DDX_Control(pDX,IDC_SLIDER2,m_SliderQ3);
DDX_Control(pDX,IDC_SLIDER1,m_SliderFrequency3);
//}}AFX_DATA_MAP
}
BEGIN_NESSAGE_MAP(CNotchPage2,CPropertyPage)
//{{AFX_MSG_MAP(CNotchPage2)
ON_WM_PAINT()
ON_WM_VSCROLL()
ON_BN_CLICKED(IDC_CHECKs,OnBypassFirst)
ON_BN_CLICKED(IDC_CHECK6,OnBypassSecond)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNotchPage2 message handlers
void CNotchPage2::OnPaint()
{
CPaintDC dc(this);// device context for painting
// TODO:Add your message handler code here
m_SliderFrequency3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Freq));
m_SliderQ3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Q));
m_SliderCut3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Cut));
m_SliderFrequency4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Freq));
m_SliderQ4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Q));
m_SliderCut4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Cut));
m_BypassFirstButton.SetCheck(g_DSPManager->GetBypassSection(kBypassNotch3));
m_BypassSecondButton.SetCheck(g_DSPManager->GetBypassSection(kBypassNotch4));
<dp n="d119"/>
// Do not call CPropertyPage::OnPaint() for painting messages
}
BOOL CNotchPage2::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO:Add extra initialization here
m_SliderFrequency3.SetRange(0,CONTROL_RANGE);
m_SliderFrequency3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Freq));
m_SliderFrequency3.SetTicFreq((CONTROL_RANGE+1)/16);
m_SliderFrequency3.SetPageSize(PG_CONTROL_AMT);
m_SliderQ3.SetRange(0,CONTROL_RANGE);
m_SliderQ3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Q));
m_SliderQ3.SetTicFreq((CONTROL_RANGE+1)/16);
m_SliderQ3.SetPageSize(PG_CONTROL_AMT);
m_SliderCut3.SetRange(0,CONTROL_RANGE);
m_SliderCut3.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch6Cut));
m_SliderCut3.SetTicFreq((CONTROL_RANGE+1)/16);
m_SliderCut3.SetPageSize(PG_CONTROL_AMT);
m_SliderFrequency4.SetRange(0,CONTROL_RANGE);
m_SliderFrequency4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Freq));
m_SliderFrequency4.SetTicFreq((CONTROL_RANGE+1)/16);
m_SliderFrequency4.SetPageSize(PG_CONTROL_AMT);
m_SliderQ4.SetRange(0,CONTROL_RANGE);
m_SliderQ4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Q));
m_SliderQ4.SetTicFreq((CONTROL_RANGE+1)/16);
m_SliderQ4.SetPageSize(PG_CONTROL_AMT);
m_SliderCut4.SetRange(0,CONTROL_RANGE);
m_SliderCu4.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch7Cut));
m_SliderCut4.SetTicFreq((CONTROL_RANGE+1)/16);
m_SliderCut4.SetPageSize(PG_CONTROL_AMT);
m_ParentWindow=(CTabDialog*)GetParent()->GetParent();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CNotchPage2::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
// TODO:Add your message handler code here and/or call default
CSliderCtrl *slider=(CSliderCtrl*)pScrollBar;
int which;
CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
Sleep(50);
if(slider==&m_SliderFrequency3)
which=kNotch6Freq;
else if(slider==&m_SliderQ3)
which=kNotch6Q;
else if(slider==&m_SliderCut3)
which=kNotch6Cut;
else if(slider==&m_SliderFrequency4)
which=kNotch7Freq;
else if(slider==&m_SliderQ4)
which=kNotch7Q;
else if(slider==&m_SliderCut4)
which=kNotch7Cut;
else
return;
g_DSPManager->SetParamValue(CONTROL_RANGE-slider->GetPos(),which);
SendStringToUI(which);
}
<dp n="d120"/>
void CNotchPage2::SendStringToUI(int which)
{
CString str;
g_DSPManager->GetStringValue(which,Str);
m_ParentWindow>SetStatusString(0,str);
}
void CNotchPage2::OnBypassFirst()
{
// TODO:Add your control notification handler code here
int state=m_BypassFirstButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassNotch3);
}
void CNotchPage2::OnBypassSecond()
{
// TODO:Add your control notification handler code here
int state=m_BypassSecondButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassNotch4);
}
<dp n="d121"/>
#if !defined(AFX_NOTCHPAGE1_H__0CF7E208_D790_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_NOTCHPAGE1_H__0CF7E208_D790_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif // _MSC_VER >=1000
// NotchPage1.h :header file
//
/////////////////////////////////////////////////////////////////////////////
// CNotchPage1 dialog
class CTabDialog
class CNotchPage1:public CPropertyPage
{
DECLARE_DYNCREATE(CNotchPage1)
// Construction
public:
CNotchPage1();
-CNotchPage1();
// Dialog Data
//{{AFX_DATA(CNotchPage1)
enum{IDD=IDD_PP4};
CButton m_BypassSecondButton;
CButton m_BypassFirstButton;
CSliderCtrl m_SliderCut2;
CSliderCtrl m_SliderQ2;
CSliderCtrl m_SliderFrequency2;
CSliderCtrl m_SliderCut1;
CSliderCtrl m_SliderQ1;
CSliderCtrl m_SliderFrequency1;
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CNotchPage1)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CNotchPage1)
virtual BOOL OnInitDialog();
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
afx_msg void OnShowWindow(BOOL bShow,UINT nStatus);
afx_msg void OnPaint();
afx_msg void OnBypassFirst();
afx_msg void OnBypassSecond();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
CTabDialog *m_ParentWindow;
void SendStringToUI(int which);
};
//{{AFX_INSERT_LOCATION}}
// Microsoft DeveloperStudio willinsertadditional declarations immediately before the previous line
#endif //!defined(AFX_NOTCHPAGE1_H__0CF7E208_D790_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d122"/>
// NotchPage1.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include "NotchPage1.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNotchPage1 property page
IMPLEMENT_DYNCREATE(CNotchPage1,CPropertyPage)
CNotchPage1::CNotchPage1() :CPropertyPage(CNotchPage1::IDD)
{
//{{AFX_DATA_INIT(CNotchPage1)
//}}AFX_DATA_INIT
}
CNotchPage1::-CNotchPage1()
{
}
void CNotchPage1::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNotchPage1)
DDX_Control(pDX,IDC_CHECK6,m_BypassSecondButton);
DDX_Control(pDX,IDC_CHECK5,m_BypassFirstButton);
DDX_Control(pDX,IDC_SLIDER6,m_SliderCut2);
DDX_Control(pDX,IDC_SLIDER5,m_SliderQ2);
DDX_Control(pDX,IDC_SLIDER4,m_SliderFrequency2);
DDX_Control(pDX,IDC_SLIDER3,m_SliderCut1);
DDX_Control(pDX,IDC_SLIDER2,m_SliderQ1);
DDX_Control(pDX,IDC_SLIDER1,m_SliderFrequency1);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNotchPage1,CPropertyPage)
//{{AFX_MSG_MAP(CNotchPage1)
ON_WM_VSCROLL()
ON_WM_SHOWWINDOW()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_CHECK5,OnBypassFirst)
ON_BN_CLICKED(IDC_CHECK6,OnBypassSecond)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNotchPage1 message handlers
BOOL CNotchPage1::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO:Add extra initialization here
m_SliderFrequency1.SetRange(0,CONTROL_RANGE);
m_SliderFrequency1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Freq));
m_SliderFrequency1.SetTicFreq((CONTROL_RANGE+1)/16);
m_SliderFrequency1.SetPageSize(PG_CONTROL_AMT);
m_SliderQ1.SetRange(0,CONTROL_RANGE);
m_SliderQ1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Q));
m_SliderQ1.SetTicFreq((CONTROL_RANGE+1)/16);
<dp n="d123"/>
m_SliderQ1.SetPageSize(PG_CONTROL_AMT);
m_SliderCut1.SetRange(0,CONTROL_RANGE);
m_SliderCut1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Cut));
m_SliderCut1.SetTicFreq((CONTROL_RANGE+1)/16);
m_SliderCut1.SetPageSize(PG_CONTROL_AMT);
m_SliderFrequency2.SetRange(0,CONTROL_RANGE);
m_SliderFrequency2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Freq));
m_SliderFrequency2.SetTicFreq((CONTROL_RANGE+1)/16);
m_SliderFrequency2.SetPageSize(PG_CONTROL_AMT);
m_SliderQ2.SetRange(0,CONTROL_RANGE);
m_SliderQ2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Q));
m_SliderQ2.SetTicFreq((CONTROL_RANGE+1)/16);
m_SliderQ2.SetPageSize(PG_CONTROL_AMT);
m_SliderCut2.SetRange(0,CONTROL_RANGE);
m_SliderCut2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Cut));
m_SliderCut2.SetTicFreq((CONTROL RANGE+1)/16);
m_SliderCut2.SetPageSize(PG_CONTROL_AMT);
m_ParentWindow=(CTabDialog*)GetParent()->GetParent();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CNotchPage1::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
// TODO:Add your message handler code here and/or call default
CSliderCtrl *slider=(CSliderCTrl*)pScrollBar;
int which;
CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
Sleep(50);
if(slider==&m_SliderFrequency1)
which=kNotch1Freq;
else if(slider==&m_SliderQ1)
which=kNotch1Q;
else if(slider==&m_SliderCut1)
which=kNotch1Cut;
else if(slider==&m_SliderFrequency2)
which=kNotch2Freq;
else if(slider==&m_SliderQ2)
which=kNotch2Q;
else if(slider==&m_SliderCut2)
which=kNotch2Cut;
else
return;
g_DSPManager->SetParamValue(CONTROL_RANGE-slider->GetPos(),which);
SendStringToUI(which);
}
void CNotchPage1::OnShowWindow(BOOL bShow,UINT nStatus)
{
CPropertyPage::OnShowWindow(bShow,nStatus);
// TODO:Add your message handler code here
}
void CNotchPage1::OnPaint()
{
CPaintDC dc(this);// device context for painting
// TODO:Add your message handler code here
m_SliderFrequency1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Freq));
m_SliderQ1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Q));
m_SliderCut1.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch1Cut));
<dp n="d124"/>
m_SliderFrequency2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Freq));
m_SliderQ2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Q));
m_SliderCut2.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch2Cut));
m_BypassFirstButton.SetCheck(g_DSPManager->GetBypassSection(kBypassNotch1));
m_BypassSecondButton.SetCheck(g_DSPManager->GetBypassSection(kBypassNotch2));
// Do not call CPropertyPage::OnPaint() for painting messages
}
void CNotchPage1::SendStringToUI(int which)
{
CString str;
g_DSPManager->GetStringValue(which,str);
m_Parentwindow->SetStatusString(0,str);
}
void CNotchPage1::OnBypassFirst()
{
// TODO:Add your control notification handler code here
int state=m_BypassFirstButton.GetState()& 0x3;
g_DSPManager->SetBypassSection(state,kBypassNotch1);
}
void CNotchPage1::OnBypassSecond()
{
// TODO:Add your control notification handler code here
int state=m_BypassSecondButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassNotch2);
}
<dp n="d125"/>
#if !defined(AFX_NEWCUTOFFPAGE_H_E2728226_E026_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_NEWCUTOFFPAGE_H__E2728226_E026_11D2_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif // _MSC_VER >=1000
// NewCutoffPage.h :header file
//
class CTabDialog;
/////////////////////////////////////////////////////////////////////////////
// CNewCutoffPage dialog
class CNewCutoffPage:public CPropertyPage
{
DECLARE DYNCREATE(CNewCutoffPage)
// Construction
public:
CNewCutoffPage();
-CNewCutoffPage();
// Dialog Data
//{{AFX_DATA(CNewCutoffPage)
enum{IDD=IDD_PP8};
CButton m BypassNLopassButton;
CSliderCtrl m_NewHiQSlider;
CSliderCtrl m_NewHiFreqSlider;
CButton m_BypassLopassButton;
CButton m_BypassHipassButton;
CSliderCtrl m_HiQSlider;
CSliderCtrl m_HiFreqSlider;
CSliderCtrl m_LoQSlider;
CSliderCtrl m_LoFreqSlider;
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CNewCutoffPage)
public:
virtual BOOL OnSetActive();
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected ;
// Generated message map functions
//{{AFX_MSG(CNewCutoffPage)
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
virtual BOOL OnInitDialog();
afx_msg void OnShowWindow(BOOL bShow,UINT nStatus);
afx_msg void OnPaint();
afx_msg void OnBypassHipass();
afx_msg void OnBypassLopass();
afx_msg void OmypassNewLopass();
//}}AFX_MSG
DECLARE_MESSAGE MAP()
CTabDialog *m_ParentWindow;
void SendStringToUI(int which);
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio
will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_NEWCUTOFFPAGE_H_E2728226_E026_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d126"/>
// NewCutoffPage.cpp :implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"NewCutoffPage.h*
#include"TabDialog.h"
#include "DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CNewCutoffPage property page
IMPLEMENT_DYNCREATE(CNewCutoffPage,CPropertyPage)
CNewCutoffPage::CNewCutoffPage():CPropertyPage(CNewCutoffPage::IDD)
{
//{{AFX_DATA_INIT(CNewCutoffPage)
//}}AFX_DATA_INIT
}
CNewCutoffPage::-CNeWCutoffPage()
{
}
void CNewCutoffPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CNewCutoffPage)
DDX_Control(pDX,IDC_CHECK7,m_BypassNLopassButton);
DDX_Control(pDX,IDC_SLIDER9,m_NewHiQSlider);
DDX_Control(pDX,IDC_SLIDER8,m_NewHiFreqSlider);
DDX_Control(pDX,IDC_CHECK5,m_BypassLopassButton);
DDX_Control(pDX,IDC_CHECK4,m_BypassHipassButton);
DDX_Control(pDX,IDC_SLIDER5,m_HiQSlider);
DDX_Control(pDX,IDC_SLIDER4,m_HiFreqSlider);
DDX_Control(pDX,IDC_SLIDER2,m_LoQSlider);
DDX_Control(pDX,IDC_SLIDER1,m_LoFreqSlider);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CNewCutoffPage,CPropertyPage)
//{{AFX_MSG_MAP(CNewCutoffPage)
ON_WM_VSCROLL()
ON_WM_SHOWWINDOW()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_CHECK4,OnBypassHipass)
ON_BN_CLICKED(IDC_CHECK5,OnBypassLopass)
ON_BN_CLICKED(IDC_CECK7,OnBypassNewLopass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CNewCutoffPage message handlers
void CNewCutoffPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar)
{
// TODO:Add your message handler code here and/or call default
CSliderCtrl *slider=(CSliderCtrl*)pScrollBar;
int which;
CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
Sleep(50);
if(slider==&m_LoFreqSlider)
which=kLoCutoffFreq;
<dp n="d127"/>
else if(slider==&m_LoQSlider)
which=kLoCutoffQ;
else if(slider ==&m_HiFreqSlider)
which=kHiCutoffFreq;
else if(slider==&m_HiQSlider)
which=kHiCutoffQ;
else if(slider==&m NewHiFreqSlider)
which=kHiCutoff2Freq;
else if(slider==&m NewHiQSlider)
which=kHiCutoff2Q;
else
return;
g_DSPManager->SetParamValue(CONTROL_RANGE-slider->GetPos (),which);
SendStringToUI(which);
}
void CNewCutoffPage::SendStringToUI(int which)
{
CString str;
g_DSPManager->GetStringValue(which,str);
m_ParentWindow->SetStatusString(0,str);
}
BOOL CNewCutoffPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO:Add extra initialization here
m_LoFreqSlider.SetRange(0,CONTROL_RANGE);
m_LoFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoCutoffFreq));
m_LoFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_LoFreqSlider.SetPageSize(PG_CONTROL_AMT);
m_LoQSlider.SetRange(0,CONTROL_RANGE);
m_LoQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoCutoffQ));
m_LoQSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_LoQSlider.SetPageSize(PG_CONTROL_AMT);
m_HiFreqSlider.SetRange(0,CONTROL_RANGE);
m_HiFreqSlider.SetPos(CONTROL_RANGE-g_DSPMamager->GetParamValue(kHiCutoffFreq));
m_HiFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_HiFreqSlider.SetPageSize(PG_CONTROL_AMT);
m_HiQSlider.SetRamge(0,CONTROL_RANGE);
m_HiQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoffQ));
m_HiQSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_HiQSlider.SetPageSize(PG_CONTROL_AMT);
m_NewHiFreqSlider.SetRange(0,CONTROL_RANGE);
m_NewHiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(HiCutofft2Freq));
m_NewHiFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_NewHiFreqSlider.SetPageSize(PG_CONTROL_AMM);
m_NewHiQSlider.SetRange(0,CONTROL_RANGE);
m_NewHiQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoff2Q));
m_NewHiQSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_NewHiQSlider.SetPageSize(PG_CONTROL_AMT);
m_ParentWindow=(CTabDialog*)GetParent()->GetParent();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CNewCutoffPage::OnShowWindow(BOOL bShow,UINT nStatus)
{
CPropertyPage::OnShowWindow(bShow,nStatus);
<dp n="d128"/>
// TODO:Add your message handler code here
}
BOOL CNewCutoffPage::OnSetActive()
{
// TODO:Add your speciali zed code here and/or call the base class
return CPropertyPage::OnSetActive();
}
void CNewCutoffPage::OnPaint()
{
CPaintDC dc(this); // device context for painting
// TODO:Add your message handler code here
m_LoFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoCutoffFreq));
m_LoQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoCutoffQ));
m_HiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoffFreq));
m_HiQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoffQ));
m_NewHiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoff2Freq));
m_NewHiQSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiCutoff2Q));
m_BypassHipassButton.SetCheck(g_DSPManager->GetBypassSection(kBypassHipass));
m_BypassLopassButton.SetCheck(g_DSPManager->GetBypassSection(kBypassLopass));
m_BypassNLopassButton.SetCheck(g_DSPManager->GetBypassSection(kBypassNLopass));
// Do not call CPropertyPage::OnPaint()for painting messages
}
void CNewCutoffPage::OnBypassHipass()
{
// TODO:Add your control notification handler code here
int state=m_BypassHipassButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassHipass);
}
void CNewCutoffPage::OnBypassLopass()
{
// TODO:Add your control notification handler code here
int state=m_BypassLopassButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassLopass);
}
void CNewCutoffPage::OnBypassNewLopass()
{
// TODO:Add your control notification handler code here
int state=m_BypassNLopassButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassNLopass);
}
<dp n="d129"/>
// ShelfEQParam.h:interface for the CShelfEQParam class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_ShelfEQPARAM_H__733FB7AB_4A49_11D3_96EE_006097CDB9E2__INCLUDED_)
#define AFX_ShelfEQPARAM_H__733FB7AB_4A49_11D3_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif //_MSC_VER>=1000
typedef struct_biquadcoef
{
float c(6]; // b0,b1,b2,a0,a1,a2
} biquadcoef;
class CShelfEQParam
{
float m_Gain; // in dB (+or-)
float m_Frequency; // in Hz
float m_SampleRate; // in Hz
double m_Pi;
bool m_HiShelf;
public:
void GetCoef(biquadcoef *);
void GetAllpassCoef(biquadcoef*);
void SetGain(float v){m_Gain=v;}
void SetGain(CString &str):
void SetFreq(float v){m_Frequency=v;}
void SetFreq(CString &str);
CShelfEQParam(bool hi);
virtual-CShelfEQParam();
};
#endif // !defined(AFX_ShelfEQPARAM_H_733FB7AB_4A49_11D3_96EE_006097CDB9E2_INCLUDED_)
<dp n="d130"/>
// ShelfEQParam.cpp:implementation of the CShelfEQParam class.
//
//////////////////////////////////////////////////////////////////////
#include"stdafx.h"
#include"sa.h"
#include"ShelfEQParam.h"
#include<stdio.h>
#include<math.h>
#ifde_DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CShelfEQParam::CShelfEQParam(bool hi)
:m_Frequency(0.5),m_Gain(0.0),m_SampleRate(44100.),m_HiShelf(hi)
{
m_Pi=acos(-1.);
}
CShelfEQParam::-CShelfEQParam()
{
}
void CShelfEQParam::SetGain(CString & str)
{
float v;
sscanf(str,"%f",&v);
m_Gain=v;
}
void CShelfEQParam::SetFreq(CString & str)
{
float v;
sscanf(str,"%f",&v);
m_Frequency=v;
}
void CShelfEQParam::GetAllpassCoef(biquadcoef *f)
{
double gamma,wc;
double normFreq = m_Frequency/m_SampleRate/2;
wc=m_pi*normFreq;
gamma=(tan(wc/2)-1)/(tan(wc/2)+1);
if(m HiShelf)
{
f->c[0] =(float)gamma; // b0
f->c[1] =1.0; // b1
}
else
{
f->c[0] =(float) -gamma; // b0
f->c[1] =-1.0; // b1
}
f->c[2]=0; // b2
f->c[3]=1.; // a0
f->c[4]=(float)gamma; // a1
<dp n="d131"/>
f->c[5]=0; // a2
}
void CShelfEQParam::GetCoef(biquadcoef *f)
{
double M.L;
biquadcoef af;
double gain=(float)pow(10.,m_Gain/20.);
GetAllpassCoef(&af);
M=(1.-gain)/2.;
L=(1.+gain)/2.;
f->c[0]=(float)(af.c[0]*M+L); // b0
f->c[1]=(float)(af.c[1]*M+af.c[4]*L); // b1
f->c[2]=(float)(af.c[2]*M+af.c[5]*L); // b2
f->c[3]=af.c[3];
f->c[4]=af.c[4];
f->c[5]=af.c[5];
}
<dp n="d132"/>
// saDlg.h:header file
//
#if !defined(AFX_SADLG_H_33D93B0B_D0B8_11D2_96EE_006097CDB9E2_INCLUDED_)
#define AFX_SADLG_H_33D93B0B_D0B8_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif // _MSC_VER >=1000
/////////////////////////////////////////////////////////////////////////////
// CSaDlg dialog
class CSaDlg:public CDialog
{
// Construction
public:
CSaDlg(CWnd* pParent=NULL);// standard constructor
// Dialog Data
//{{AFX_DATA(CSaDlg)
enum{IDD=IDD_SA_DIALOG};
// NOTE;the ClassWizard will add data members here
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//({AFX_VIRTUAL(CSaDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
HICON m_hIcon;
// Generated message map functions
//{{AFX_MSG(CSaDlg)
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID,LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnButton1();
afx_msg void OnButton2();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studiowill insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SADLG_H_33D93B0B_D0B8_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d133"/>
// saDlg.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"saDlg.h"
#include "unit_ppi.h"
#include"functs.h"
#include"TabDialog.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
static int cmd_delay=1000;
static int io_delay=50;
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg dialog used for App About
class CAboutDlg :public CDialog
{
public:
CAboutDlg();
// Dialog Data
//{{AFX_DATA(CAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg():CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg,CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSaDlg dialog
CSaDlg::CSaDlg(CWnd* pParent /*=NULL*/)
:CDialog(CSaDlg::IDD,pParent)
<dp n="d134"/>
//{{AFX_DATA_INIT(CSaDlg)
//NOTE:the ClassWizard will add member initialization here
//)}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in winJI
m_hIcon=AfxGetApp()->LoadIcon(IDR_MINFRAME);
}
void CSaDlg::DoDataExchange(CDataExchange* pDX)
{
Coialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CSaDlg)
// NOTE:the ClassWizard Will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CSaDlg.CDialog)
//{{AFX_MSG_MAP(CSaDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BUTTON1,OnButton1)
ON_BN_CLICKED(IDC_BUTTON2,OnButton2)
//}}AFX_MSG_MAP
END_ESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSaDlg message handlers
BOOL CSaDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Add"About..."menu item to system menu.
// IDM_ABOUTBOX must be in the system command range
ASSERT((IDM_ABOUTBOX & 0xFFF0)==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu=GetSystemMenu(FALSE);
if(pSysMenu !=NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if(!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBOX,strADDucmenu);
}
}
// Set the icon for this dialog. the framework does this automatically
// when the application′s main window is not a dialog
SetIcon(m hIcon,TRUE); // Set big icon
SetIcon(m hIcon,FALSE): // Set small icon
// TODO:Add extra initialization here
if(load_dll()==false)
{
MessageBox("UNIT_PPI not found in the system directory. Fix this and restart application.");
return false;
}
init_Port_spi(1);
set_cmd_delay_cnt_value(cmd_delay);
set_io_delay_cnt_value(io_delay);
return TRUE: // return TRUE unless you set the focus to a control
}
void CSaDlg::OnSysCommand(UINT nID,LPARAM(Param)
{
if((nID & 0xFFF0)==IDM ABOUTBOX)
<dp n="d135"/>
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID,lParam);
}
}
// If you add a minimize button to your dialog,you will need the code below
// to draw the icon. For MFC applications using the document/view model,
// this is automatically done for you by the framework.
void CSaDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this);// device context for painting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(), 0);
// Center icon in client rectangle
int cxIcon=GetSystemMetrics(SM_CXICON);
int cyIcon=GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x=(rect,Width()-cxIcon+1)/2;
int y=(rect,Height()-cyIcon+1)/2;
// Draw the icon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CSaDlg::OnQueryDragIcon()
{
return(HCURSOR)m_hIcon;
}
void CSaDlg::OnButton1()
{
long tlong;
tlong=spi_xchng24(0xAA55AA);
tlong=spi_xchng24(0x0);
}
void CSaDlg::OnButton2()
{
// long tlong;
//
// tlong=spi_xchng24(0x654321);
// tlong=spi_xchng24(0x0);
CTabDialog dlg;
dlg DoModal();
}
<dp n="d136"/>
// sa.h:main header file for the SA application
//
#if !definned(AFX_SA_H__33D93B09_D0B8_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_SA_H_33D93B09_D0B8_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER>=1000
#pragma once
#endif //_MSC_VER >=1000
#ifndef__AFXWIN_H__
#error includ′estdafx.h′before including this file for PCH
#endif
#include"resource.h" // main symbols
/////////////////////////////////////////////////////////////////////////////
// CSaApp;
// See sa.cpp for the implementation of this class
//
class CSaApp:public CWinApp
{
public:
CSaApp();
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CSaApp)
public:
virtual BOOL InitInstance();
//}}AFX_VIRTUAL
// Implementation
//{{AFX_MSG(CSaApp)
//NOTE-the ClassWizard will add and remove member functions here.
// DO NOT EDIT what you see in these blocks of generated code !
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
/////////////////////////////////////////////////////////////////////////////
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SA_H__33D93B09_D0B8_11D2_96EE_006097CDB9E2_INCLUDED_)
<dp n="d137"/>
// sa.cpp :Defines the class behaviors for the application.
//
#include"stdafx.h"
#include"sa.h"
#include"saDlg.h"
#include"TabDialog.h"
#include"I2CDialog.h"
#include"DSP56kManager.h"
CDSP56kManager *g_DSPManager;
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE{}=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CSaApp
BEGIN_MESSAGE_MAP(CSaApp,CWinApp)
//{{AFX_MSG_MAP(CSaApp)
// NOTE-the ClassWizard will add and remove mapping macros here.
// DO NOT EDIT what you see in these blocks of generated code!
//}}AFX_MSG
ON_COMMAND(ID_HELP,CWinApp::OnHelp)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CSaApp construction
CSaApp::CSaApp()
{
// TODO:add construction code here,
// Place all significant initialization in InitInstance
}
/////////////////////////////////////////////////////////////////////////////
// The one and only CSaApp object
CSaApp theApp:
/////////////////////////////////////////////////////////////////////////////
// CSaApp initialization
BOOL CSaApp::InitInstance()
{
AfxEnableControlContainer();
// Standard initialization
// If you are not using these features and wish to reduce the size
// of your final executable,you should remove from the following
// the specific initialization routines you do not need.
#ifdef_AFXDLL
Enable3dControls(); // Call this when using MFC in a shared DLL
#else
Enable3dControlsStatic();// Call this when linking to MFC statically
#endif
// Set dialog background color to black
// SetDialogBkColor(RGB(0,0,0),RGB(255,255,255));
int response;
CI2CDialog idlg;
try
{
if((response=idlg.DoModal()) !=IDOK)
{
<dp n="d138"/>
if(response==IDABORT)
{
AfxMessageBox("Trouble initializing");
Sleep(1000);
}
// return FALSE;
}
}
catch(CException"e)
{
// printf("Trouble initializing\n");
// Sleep(1000);
return FALSE;
}
// CSaDlg dlg;
CTabDialog dlg;
m_pMainWnd=&dlg;
int nResponse=dlg.DoModal();
if(nResponse==IDOK)
{
// TODO:Place code here to handle when the dialog is
// dismissed with OK
}
else if(nResponse==IDCANCEL)
(
// TODO:Place code here to handle when the dialog is
// dismissed with Cancel
}
// Since the dialog has been closed,return FALSE so that we exit the
// application,rather than start the application"s message pump.
return FALSE;
}
<dp n="d139"/>
//{{NO_DEPENDENCIES}}
// Microsoft Developer Studio generated include file.
// Used by sa.rc
//
#define IDM_ABOUTBOX 0x0010
#define IDD_ABOUTBOX 100
#define IDS_ABOUTBOX 101
#define IDD_SA_DIALOG 102
#define IDR_MAINFRAME 128
#define IDD_DIALOG1 129
#define IDD_PP1 130
#define IDR_MENU1 130
#define IDD_PP2 131
#define IDD_PP3 132
#define IDD_PP4 133
#define IDD_PP5 134
#define IDD_PP6 135
#define IDD_PP7 136
#define IDD_PP8 137
#define IDD_PP9 138
#define IDD_DIALOG2 139
#define IDD_DIALOG3 140
#define IDD_DIALOG4 141
#define IDD_PP10 142
#define IDD_PP11 143
#define IDC_BUTTON1 1001
#define IDC_BUTTON2 1002
#define IDC_SLIDER1 1004
#define IDC_CHECK1 1005
#define IDC_SLIDER2 1005
#define IDC_SLIDER3 1006
#define IDC_RADIO1 1006
#define IDC_SLIDER4 1007
#define IDC_CHECK2 1007
#define IDC_RADIO2 1007
#define IDC_EDIT1 1007
#define IDC_SLIDER5 1008
#define IDC_CHECK3 1008
#define IDC_RADlO3 1008
#define IDC_SLIDER6 1009
#define IDC_CHECK4 1009
#define IDC_RADlO4 1009
#define IDC_SLIDER7 1010
#define IDC_CHECK5 1010
#define IDC_SLIDER8 1011
#define IDC_CHECK6 1011
#define IDC_SLIDER9 1012
#define IDC_CHECK7 1013
#define ID_MENUITEM32771 32771
#define ID_MENUITEM32772 32772
#define ID_FILE_EXPORTPARAMFILE 32773
//Next default values for new objects
//
#ifdef APSTUDIO_INVOKED
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 142
#define _APS_NEXT_COMMAND_VALUE 32774
#define _APS_NEXT_CONTROL_VALUE 1011
#define _APS_NEXT_SYMED_VALUE 103
#endif
#endif
<dp n="d140"/>
#if !defined(AFX_TABDIALOG_H_5CB3DF04_D20F_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_TABDIALOG_H__5CB3DF04_D20F_11D2_96EE_006097CDB9E2__INCLUDED_
#if _MSC_VER >=1000
#pragma once
#endif // _MSC_VER >=1000
// TabDialog.h:header file
//
#include"Page1.h"
#include"MainPage.h"
#include"DDX.h"
#include"NotchPage1.h"
#include"NotchPage2.h"
#include"StWaveRejPage.h"
#include"ShelvPage.h"
#include"NewCutoffPage.h"
#include"AllpassPage.h"
#include"DBNotch.h"
/////////////////////////////////////////////////////////////////////////////
// CTabDialog dialog
class CTabDialog:public CDialog
{
// Construction
public:
void DisplayI2CState(lomg error);
virtual void SetStatusString(int which,CString &s);
CTabDialog(CWnd* pParent=NULL): // standard constructor
// Dialog Data
//{{AFX_DATA(CTabDialog)
enum{IDD=IDD_DIALOG1};
// NOTE:the ClassWizard will add data members here
//}}AFX_DATA
// Overrides
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTabDialog)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
virtual void DisplayMode(int);
CStatusBar m_StatusBar;
CPropertySheet m_dlgPropSheet;
HICON m_hIcon;
// CPage1 m_Page1;
CMainPage m_MainPage;
CDDX m_DDXPage;
CNotchPage1 m_Notch1Page;
CNotchPage2 m_Notch2Page:
CStWaveRejPage m_StWaveRejPage;
CShelvPage m_ShelvPage;
// CCutoffPage m_CutoffPage;
CNewCutoffPage m_CutoffPage;
CAllpassPage m_AllpassPage;
CDBNotch m_DBNotch;
CBrush m_brush;
UINT m_timerID;
BOOL m_HDCDDisplay;
int m_AIdx,m_ICnt;
int m_ErrorCounter;
// Generated message map functions
//{{AFX_MSG(CTabDialog)
<dp n="d141"/>
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID,LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
afx_msg void OnClose();
afx_msg vois OnMove(int x,int y);
afx_msg HBRUSH OnCtlColor(CDC* pDC,CWnd"pWnd,UINT nCtlColor);
afx_msg void OnOpenMenu();
afx_msg void OnSaveMenu();
afx_msg void OnTimer(UINT nIDEvent);
afx_msg void OnFileExportparamfile();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_TABDIALOG_H__5CB3DF04_D20F_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d142"/>
// TabDialog.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#include"I2CCommErrorDialog.h"
#include<afxdlgs.h>
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
#define TIMERID 1
#define ID_HDCD_DETECT 56000
#define ID_ERROR_DISPLAY (ID_HDCD_DETECT+1)
static UINT auIDStatusBar[]={
ID_SEPARATOR,
ID_HDCD_DETECT,
ID_SEPARATOR,
ID_ERROR_DISPLAY
};
#define AARRAYSIZE 16
static char *Detect_Array[AARRAYSIZE]={
" HDCD",
" HDCD ",
" HDCD ",
" HDCD ",
" HDCD ",
" HDCD ",
" HDCD ",
" HDCD ",
" HDCD ",
" HDCD ",
" HDCD ",
" HDCD ",
"HDCD ",
"DCD H",
"CD HD",
"D HDC"
};
/////////////////////////////////////////////////////////////////////////////
// CTabAboutDlg dialog used for App About
class CTabAboutDlg :public CDialog
{
public:
CTabAboutDlg();
// Dialog Data
//{{AFX_DATA(CTabAboutDlg)
enum{IDD=IDD_ABOUTBOX};
//}}AFX_DATA
// ClassWizard generated virtual function overrides
//{{AFX_VIRTUAL(CTabAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange"pDX ); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
//{{AFX_MSG(CTabAboutDlg)
<dp n="d143"/>
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CTabAboutDlg::CTabAboutDlg() :CDialog(CTabAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CTabAboutDlg)
//}}AFX_DATA_INIT
}
void CTabAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTabAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTabAboutDlg,CDialog)
//{{AFX_MSG_MAP(CTabAboutDlg)
//No message handlers
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTabDialog dialog
CTabDialog::CTabDialog(CWnd* pParent /*=NULL*/)
:CDialog(CTabDialog::IDD,pParent)
{
//{{AFX_DATA_INIT(CTabDialog)
// NOTE:the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_hIcon=AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTabDialog::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTabDialog)
// NOTE:the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTabDialog,CDialog)
//{{AFX_MSG_MAP(CTabDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_WM_CLOSE()
ON_WM_MOVE()
ON_WM_CTLCOLOR()
ON_COMMAND(ID MENUITEM32771,OnOpenMenu)
ON_COMMAND(ID_MENUITEM32772,OnSaveMenu)
ON_WM_TIMER()
ON_COMMAND(ID_FILE_EXPORTPARAMFILE,OnFileExportparamfile)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTabDialog message handlers
#define PS_WIDTH 222
#define PS_HEIGHT 215
BOOL CTabDialog::OnInitDialog()
{
int partsList[]=(50,100,150,-1};
<dp n="d144"/>
CDialog::OnInitDialog();
// Add"About..."menu item to system menu.
// IDM_ABOuTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0 )==IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu=GetSystemMenu(FALSE);
if(pSyaMenu !=NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if((strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING,IDM_ABOUTBDX,strAboutMenu);
}
}
// Set the icon for this dialog,The framewok does this automatically
// when the application′s main window is not a dialog
SetIcon(m_hIcon,TRUE); // Set big icon
SetIcon(m_hIcon,FALSE); // Set small icon
// build brush
m_brush.CreateSolidBrush(RGB(0,0,0));
// build prop sheet
m_dlgPropSheet.AddPage(&m_MainPage);
m_dlgPropSheet.AddPage(&m_DDXPage);
m_dlgPropSheet.AddPage(&m_ShelvPage);
m_dlgpropSheet.AddPage(&m_CutoffPage);
m_dlgpropSheet.AddPage(&m_Notch1Page);
m_dlgPropSheet.AddPage(&m_Notch2Page);
m_dlgPropSheet.AddPage(&m_StWaveRejPage);
m_dlgPropSheet.AddPage(&m_AllpassPage);
m_dlgPropSheet.AddPage(&m_DBNotch);
m_dlgPropSheet.Create(this,WS_CHILD | WS_VISIBLE,0);
m_dIgPropSheet.ModifyStyleEx(0,WS_EX_CONTROLPARENT);
m_dlgPropSheet.ModifyStyle(0,WS_TASBTOP);
m_dlgPropSheet.SetWindowPos(NULL,0,0,PS_WIDTH,PS_HEIGHT,SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE);
// resize dialog to fit propsheet exactly
RECT rect;
m_dlgPropSheet.GetWindowRect(&rect);
//rect.bottom +=14;
//rect rioht +=14;
SetWindowPos(&wndBottom,rect.left,rect.top,rect.right,rect.bottom,SWP_NOZORDER | SWP_NOMOVE);
// Add status bar
RECT sizerect;
sizerect.top=PS_HEIGHT;
sizerect.bottom=sizerect.top+20;
sizerect.left=0;
sizerect.right=PS_WIDTH;
//m_StatusBar.Create(WS_CHILD | WS_VISIBLE | CCS_BOTTOM,sizerect,this,AFX_IDW_STATUS_BAR);
//m_StatusBar.ShowWindow(SW_SHOWNA);
//m_StatusBar.SetSimple();
//m_StatusBar.SetText("Hello world".255.0);
m_StatuaBar.Create(this);
//m_StatusBar.SetIndicators(auIDStatusBar,sizeof(auIDStatusBar)/sizeof(UINT));
//m_StatusBar.SetPaneInfo(0,m_StatusBar.GetItemID(0),SBPS_STRETCH,NULL);
//m_StatusBar.GetStatusBarCtrl().SetText("Hello world!",0,0);
CRect rcClientStart;
CRect rcClientNow;
GetClientRect(rcClientStart);
<dp n="d145"/>
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,
0,reposQuery,rcClientNow);
// Now move all the controls so they are in the same relative
// position within the remaining client area as they would be
// with no control bars.
/* CPoint ptOffset(rcClientNow.left - rcClientStart.left,
rcClientNow.top - rcClientStart.top);
CRect rcChild;
CWnd* pwndChild=GetWindow(GW_CHILD);
while(pwndChild)
{
pwndChild->GetWindowRect(rcChild);
ScreenToClient(rcChild);
rcChild.OffsetRect(ptOffset);
pwndChild->MoveWindow(rcChild,FALSE);
pwndChild=pwndChild->GetNextWindow();
} */
// Adjust the dialog window dimensions
CRect rcWindow;
GetWindowRect(rcWindow);
rcWindow.right +=rcClientStart.Width()-rcClientNow.Width();
rcWindow.bottom +=rcClientStart.Height()-rcClientNow.Height();
rcWindow.bottom +=5;
MoveWindow(rcWindow,FALSE);
// And position the control bars
RepositionBars(AFX_IDW_CONTROLBAR_FIRST,AFX_IDW_CONTROLBAR_LAST,0);
m_timerID=0;
m_timerID=SetTimer(TIMERID,50,NULL);
m_ErrorCounter=0;
m_HDCDDisplay=false;
DisplayMode(1);
SetWindowText("Untitled");
partsList[0] =rcClientNow.Width()/4;
partsList[1] =partsList[0]+(rcClientNow.Width()/4);
partsList[2] =partsList[1]+(rcClientNow.Width()/4);
partsList[3] =-1;
m_StatusBar.GetStatusBarCtrl().SetParts(sizeof(partsList)/sizeof(int),partsList);
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CTabDialog::OnClose()
{
// if(m_Page1)
// delete m_Page1;
// if(m_Page2)
// delete m_Page2;
// if(m_Page3)
// delete m_Page3;
if(m_timerID)
KillTimer(m_timerID);
delete g_DSPManager;
CDialog::OnClose();
}
void CTabDialog::OnSysCommand(UINT nID,LPARAM lParam)
{
if((nID & 0xFFF0)==IDM_ABOUTBOX)
{
CTabAboutDlg dlgAbout;
<dp n="d146"/>
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID,lParam);
}
}
void CTabDialog::OnPaint()
{
// CPaintDC dc(this);// device context for painting
// TODO:Add your message handler code here
// Do not call CDialog::OnPaint() for painting messages
if(IsIconic())
{
CPaintDC dc(this);// device context for painting
SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);
// Center icon in client rectangle
int cxIcon=GetSystemMetrics(SM_CXICON);
int CyIcon=GetSystemMetrics(SM_CYICON);
CRect rect;
GetCliencRect(&rect);
int x=(rect.Width()-cxIcon+1)/2;
inty=(rect.Height()-cyIcon+1)/2;
// Draw the icon
dc.DrawIcon(x,y,m_hIcon);
}
else
{
// m_StatusBar.RedrawWindow();
CDialog::OnPaint();
}
}
void CTabDialog::OnMove(int x,int y)
{
CDialog::OnMove(x,y);
// TODO:Add your message handler code here
}
// The system calls this to obtain the cursor to display while the user drags
// the minimized window.
HCURSOR CTabDialog::OnQueryDragIcon()
{
return(HCURSOR) m_hIcon;
}
HBRUSH CTabDialog::OnCtlColor(CDC*pDC,CWnd*pWnd,UINT nCtlColor)
{
HBRUSH hbr=CDialog::OnCtlColor(pDC,pWnd,nCtlColor);
// TODO:Change any attributes of the DC here
// TODO:Return a different brush if the default is not desired
return hbr;
#if 0
return m_brush;
#endif
}
void CTabDialog::OnOpeMenu()
{
<dp n="d147"/>
// TODO;Add your command handler code here
// char BASED_CODE szFilter()="Text Filrs(*.txt)|*.txt||";
// CFileDialog fileDlg(TRUE,NULL,NULL,0L,szFilter,NULL);
// CFileOialog fileDlg(TRUE);
CFileDialog fikDlg(TRUE,"txt",NULL,OFN_HIDEREADONLY,"Text Files(".txt)|*.txt|All
Files((*.*||*.*,this)
if(fileDlg.DoModal()==IDOK)
{
int array_size=0;
CString string;
CStringArray array;
CStdioFile file(fileDlg.GetPathName().CFile::modeRead| CFile::typeText);
while(file.ReadString(string))
{
array.SetAtGrow(array_size. string);
array_size++;
}
g_DSPManager->SetDSPSettings(array);
SetWindowText(fileDlg.GetFileName());
// MM 5/13/99 Invalidate the window so that window is redrawn
Invalidate(false);
}
}
void CTabDialog::OnSaveMenu()
{
// TODO:Add your command handler code here
CFileDialog fileDlg(FALSE,"txt",NULL,OFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,"Text
Files(*.txt)|*.txt||",this);
if(fileDlg.DoModal()==IDOK)
{
int array_index=0;
CString string.
CStringArray array;
g_DSPManager->GetDSPSettings(array);
CStdioFile file(fileDlg,GetPathName(),CFile::modeCreate | CFile::modeWrite | CFile::typeText);
while(array_index<array.GetSize())
{
string=array.GetAt(array_index);
file.WriteString(string);
file.WriteString("\n");
array_index++;
}
}
}
void CTabDialog::OnFileExportparamfile()
{
CFileDialoq fileDlq(FALSE,"prm",NULL,CFN_OVERWRITEPROMPT|OFN_HIDEREADONLY,"Parameter
Files(*.prm)|*.prm||*,this);
if(fileDlg.DoModal()==IDOK)
{
int array_index=0;
CString string;
CStringArray array;
g_DSPManager->GetFilterBlob(array);
CStdioFile file(fileDlg.GetPathName().CFile::modeCreate | CFile::modeWrite | CFile::tyPeBinary)
while(array_index < array.GetSize() )
{
string=array.GetAt(array_index);
file.WriteString(string);
file.WriteString("\n");
array_index++;
<dp n="d148"/>
}
void CTabDialog::OnTimer(UINT nIDEvent)
{
// TODO:Add your message handler code here and/or call default
if(nIDEvent==TIMERID)
{
DisplayMode(g_DSPManager->GetHDCDMode());
DisplayI2CState(0L);
}
else
{
CDialog::OnTimer(nIDEvent);
}
}
void CTabDialog::DisplayMode(int value)
{
if(value <0)
{
DisplayI2CState(-value);
/* char s[100]:
sprintf(s,"0x%x",-value);
m_StatusBar.GetStatusBarCtrl().SetText(s,3,0);*/
/* if(m_timerID)
KillTimer(m_timerID);
CI2CCommErrorDialog dlg;
char s[100];
sprintf(s,"0x%x",-value);
dlg.m_ErrorCode=s;
if(dlg.DoModal()==IDCANCEL)
EndDialog(IDCANCEL);
else
m_timerID=SetTimer(TIMERID,50,NULL);*/
}
else if(value)
{
if((m_HDCDDisplay)
{
m_ICnt=0;
m_AIdx=0;
m_StatusBar,GetStatusBarCtrl(),SetText(Detect_Array[m_AIdx++],1,0);
//SetWindowText(Detect_Array[m_AIdx++]);
}
else
{
m_ICnt++;
if(m ICnt >5)
{
m_ICnt=0;
m_StatusBar.GetStatusBarCtrl().SetText(Detect_Array[m_AIdx++],1,0);
//SetWindowText(Detect_Array[m_AIdx++]);
if(m_AIdx>=AARRAYSIZE)
m_AIdx=0;
}
}
m_HDCDDisplay=true ;
}
else
{
if(m_HDCDDisplay)
m_StatusBar.GetStatusBarCtrl|).SetText("BAD CD..NO DONUT",1,0);
//SetwindowText("BAD CD.. NO DONUT");
m_HDCDDisplay=false;
}
<dp n="d149"/>
void CTabDialog::SetStatusString(int which,CString & s)
{
m_StatusBar.GetStatusBarCtrl()SetText(s,0,0);
}
void CTabDialog::DisplayI2CState(long error)
{
if(error)
{
char s[100];
sprintf(s,"0x%x",error);
m_StatusBar.GetStatusBarCtrl().SetText(s,3,0);
m_ErrorCounter=100; // 5 seconds
}
else
{
if(m_ErrorCounter)
{
m_ErrorCounter--;
if(m_ErrorCounter > 0)
return;
} if(g_DSPManager->IsBusy())
{
m_StatusBar.GetStatusBarCtrl().SetText("Transmitting..",3,0);
}
else
{
m_StatusBar.GetStatusBarCtrl().SetText(""3,0);
}
}
}
<dp n="d150"/>
#if !defined(AFX_STWAVEREJPACE_H_0CF7E209_D790_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_STWAVEREJPAGE_H__0CF7E209_D790_11D2_96EE_006097CDB9E2_INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif //_MSC_VER >=1000
// StWaveRejPage.h:header file
//
/////////////////////////////////////////////////////////////////////////////
// CStWaveRej Page dialog
class CTabDialog;
class CStWaveRejPage;public CPropertyPage
{
DECLARE_DYNCREATE(CStWaveRejPage)
// Construction
public:
CStWaveRejPagc();
-CStWaveRejPage();
// Dialog Data
//{{AFX_DATA(CStWaveRejPage)
enum {IDD=IDD_PP5};
CButton m_BypassButton;
CSliderCtrl m_Notch3BoostSlider;
CSliderCtrl m_Notch3QSlider;
CSliderCtrl m_Notch2CutSlider;
CSliderCtrl m_Notch2QSlider;
CSliderCtrl m_Notch2FreqSlider;
CSliderCtrl m_Notch1CutSlider;
CSliderCtrl m_Notch1QSlider;
CSliderCtrl m_Notch1FreqSlider;
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CStWaveRejPage)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CStWaveRejPage)
virtual BOOL OnInitDialog();
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
afx_msg void OnShowWindow(BOOL bShow.UINT nStatus);
afx_msg void OnPaint();
afx_msg void OnBypass();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
CTabDialog *m_ParentWindow;
void SendStringToUI(int which);
};
//{{AFX_INSER T_LOCATION}}
//Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_STWAVEREJPAGE_H_0CF7E209_D790_11D2_96EE_006097CDB9E2_INCLUDED_)
<dp n="d151"/>
// StWaveRejPage.cpp :implementation file
//
#include"stdafx.h"
#include"sa.h"
#include"StWaveRejPage.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CStWaveRej Page property page
IMPLEMENT_DYNCREATE(CStWaveRejPage,CPropertyPage)
CStWaveRejPage::CStWaveRejPage():CPropertyPage(CStWaveRejPage::IDD)
{
//{{AFX_DATA_INIT(CStWaveRejPage)
//}}AFX_DATA_INIT
}
CStWaveRejPage::-CStWaveRejPage()
{
}
void CStWaveRejPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CStWaveRejPage)
DDX_Control(pDX,IDC_CHECK5,m_BypassButton);
DDX_Control(pDX,IDC_SLIDER9,m_Notch3BoostSlider);
DDX_Control(pDX,IDC_SLIDER8,m_Notch3QSlider);
DDX Control(pDX,IDC_SLIDER6,m_Notch2CutSlider);
DDX_Control(pDX,IDC_SLIDER5,m_Notch2QSlider);
DDX_Control(pDX,IDC_SLIDER4,m_Notch2FreqSlider);
DDX_Control(pDX,IDC_SLIDER3,m_Notch1CutSlider);
DDX_Control(pDX,IDC_SLIDER2,m_Notch1QSlider);
DDX Control(pDX,IDC_SLIDER1,mNotch1FreqSlider);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CStWaveRejPage,CPropertyPage)
//{{AFX_MSG_MAP(CStWaveRejPage)
ON_WM_VSCROLL()
ON_WM_SHOWWINDOW()
ON_WM_PAINT()
ON_BNCLICKED(IDC_CHECK5,OnBypass)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CStWaveRejPage message handler8
BOOL CStWaveRejPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO:Add extra initialization here
m_Notch1FreqSlider.SetRange(0,CONTROL_RANGE);
m_Notch1FreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Freq));
m_Notch1FreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_Notch1FreqSlider.SetPageSize(PG_CONTROL_AMT);
m_Notch1QSlider.SetRange(0,CONTROL_RANGE);
m_Notch1QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Q));
m_Notch1QSlider.SetTicFreq((CONTROL_RANGE+1}/16);
<dp n="d152"/>
m_Notch1QSlider.SetPageSize(PG_CONTROL_AMT);
m_Notch1CutSlider.SetRange(0.CONTROL_RANGE);
m_Notch1CutSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Cut));
m_Notch1CutSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_Notch1CutSider.SetPageSize(PG_CONTROL_AMT);
m_Notch2FreqSlider.SetRange(0,CONTROL_RANGE);
m_Notch2FreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch4Freq));
m_Notch2FreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_Notch2FreqSlider.SetPageSize(PG_CONTROL_AMT);
m_Notch2QSlider.SetRange(0,CONTROL_RANGE);
m_Notch2QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch4Q));
m_Notch2QSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_Notch2QSlider.SetPageSize(PG_CONTROL_AMT);
m_Notch2CutSlider.SetRange(0,CONTROL_RANGE);
m_Notch2CutSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch4Cut));
m_Notch2CutSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_Notch2CutSlider.SetPageSize(PG_CONTROL_AMT);
m_Notch3QSlider.SetRange(0,CONTROL_RANGE);
m_Notch3QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamvalue(kNotchSQ));
m_Notch3QSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_Notch3QSlider.SetPageSize(PG_CONTROL_AMT);
m_Notch3BoostSlider.SetRange(0,CONTROL_RANGE);
m_Notch3BoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch5Cut));
m_Notch3BoostSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_Notch3BoostSlider.SetPageSize(PG_CONTROL_AMT);
m_ParentWindow=(CTabDialog*)GetParent()->GetParent();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CStWaveRejPage::SendStringToUI(int which)
{
CString str;
g_DSPManager->GetStringValue(which,str);
m_ParentWindow->SetStatusString(0,str);
}
void CStWaveRejPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBa r*pScrollBar)
{
// TODO:Add your message handler code here and/or call default
CSliderCtrl *slider=(CSliderCtrl *)pScrollBar;
int which;
CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
Sleep(50);
if(slider ==&m_NotchlFreqSlider)
which=kNotch3Freq:
else if(slider==&m_Notch1QSlider)
which=kNotch3Q;
else if(slider==&m_Notch1CutSlider)
which=kNotch3Cut;
else if(slider==&m_Notch2FreqSlider)
which=kNotch4Freq;
else if(slider==&m_Notch2QSlider)
which=kNotch4Q;
else if(slider==&m_Notch2CutSlider)
which=kNotch4Cut;
else if(slider==&m_Notch3QSlider)
which=kNotch5Q;
<dp n="d153"/>
else if(slider==&m_Notch3BoostSlloer)
which=kNotch5Cut;
else
return;
g_DSPManager->SetParamValue(CONTROL_RANGE-slioer->GetPos(),which);
SendStringToU1(which);
}
void CStWaveRejPage::OnShowWindow(BOOL bShow,UINT nStatus)
{
CPropertyPage::OnShowWindow(bShow,nStatus);
// TODO:Add your message handler code here
}
void CStWaveRejPage::OnPaint()
{
CPaintDC dc(this);// device context for painting
// TODO:Add your message handler code here
m_Notch1FreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Freq));
m_Notch1QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Q));
m_otch1CutSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch3Cut));
m_Notch2FreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch4Freq));
m_Notch2QSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(Notch4Q));
m_Notch2CutSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch4Cut));
m_Notch3QSlider.SetPos(CONTRO_RANGE-g_DSPManager->GetParamValue(kNotch5Q));
m_Notch3BoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kNotch5Cut));
m_BypassButton.SetCheck(g_DSPManager->GetBypassSection(kBypassConecry));
// Do not call CPropertyPage::OnPaint() for painting messages
}
void CStWaveRejPage::OnBypass()
{
// TODO:Add your control notification handler code here
int state=m_BypassButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state,kBypassConecry);
}
<dp n="d154"/>
/*
There a number of blocks(processing units).
The signal flow is linenr currently.
Each item is an ascii line of text
The file format is as follows:
version number
block type
number of params for block
block param #1
block param #2
block param #3
block param #n
block type
number of params for block
block param #1
block param #2
block param #3
block param #n
*/
// file version number
#define BLOB_FILE_VERSION 1
// block type descriptor
typedef enum {
BLOCK_DELAY,
BLOCK_GAIN,
BLOC_PEQ,
BLOCK_AP,
BLOCK_LS,
BLOCK_HS,
BLOCK_HP,
BLOCK_LP,
BLOCK_LP2
} ProcessType;
<dp n="d155"/>
// SPIPEMicroComm.h:interface for the SPIPEMicroComm class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SPIPEMICROCOMM_H__33F9EF06_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_SPIPEMICROCOMM_H__33F9EF06_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_
#if_MSC_VER >=1000
#pragma once
#endif //_MSC_VER >=1000
#include "DSPComm.h"
class SPIPEMicroComm:public DSPComm
{
int cmd_delay;
int io_delay;
public:
SPIPEMicroComm();
virtual-SPIPEMicroComm();
virtual long SendDSPWord(long);
virtual long SendDSPMemory(char*,long);
};
#endif // !defined(AFX_SPIPEMICROCOMM_H__33F9EF06_F6EF_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d156"/>
// SPIPEMicroComm.cpp:implementation of the SPIPEMicroComm class.
//
//////////////////////////////////////////////////////////////////////
#include"stdafr.h"
#include"sa.h"
#include"SPIPEMicroComm.h"
#include"unit_ppi.h"
#include"functs.h"
#ifdef_DEBUG
#undef THIS_FILE
static char THIS_FILE[]*__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
SPIPEMicroComm::SPIPEMicroComm()
{
cmd_delay=1000;
io_delay=50;
if(load_dll()==false)
{
MessageBox(NULL,"UNIT_PPI not found in the system directory.Fix this and restart application.
Will Robinson",MB_OK | MB_ICONSTOP);
}
else
{
init_port_spi(1);
set_cmd_delay_cnt_value(cmd_delay):
set_io_delay_cnt_value(io_delay):
}
}
SPIPEMicroComm::-SPIPEMicroComm()
{
}
long SPIPEMicroCocomm::SendDSPWord(long value)
{
return(spi_xchng24(value));
}
long SPIPEMicIoComm::SendDSPMemory(char"data,long len)
{
return(0L);
}
<dp n="d157"/>
#if !defined(AFX_SHELVPAGE_H__6F151624_D84D_11D2_96EE_006097CDB9E2__INCLUDED_)
#define AFX_SHELVPAGE_H__6F151624_D84D_11D2_96E_006097CDB9E2__INCLUDED_
#if MSC VER >=1000
#pTagma once
#endif // _MSC_VER >=1000
// ShelvPage.h:header file
//
/////////////////////////////////////////////////////////////////////////////
// CShelvPage dialog
class CTabDialog;
class CShelvPage :public CPropertyPage
{
DECLARE_DYNCREATE(CShelvPage)
// Construction
public:
CShelvPage();
-CShelvPage();
// Dialog Data
//{{AFX_DATA(CShelvPage)
enum{IDD=IDD_PP6};
CButton m_BypassSecondButton;
CButton m_BypassFirstButton;
CSliderCtrl m_HiBoostSlider;
CSliderCtrl m_HiFreqSlider;
CSliderCtrl m_LoBoostSlider;
CSliderCtrl m_LoFreqSlider;
//}}AFX_DATA
// Overrides
// ClassWizard generate virtual function overrides
//{{AFX_VIRTUAL(CShelvPage)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
//}}AFX_VIRTUAL
// Implementation
protected:
// Generated message map functions
//{{AFX_MSG(CShelvPage)
virtual BOOL OnInitDialog();
afx_msg void OnVScroll(UINT nSBCode,UINT nPos,CScrollBar* pScrollBar);
afx_msg void OnShowWindow(BOOL bShow,UINT nStatus);
afx_msg void OnPaint():
afx_msg void OnBypassFirst();
afx_msg void OnBypassSecond();
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
CTabDialog *m_ParentWindow;
void SendStringToUI(int which):
};
//{{AFX_INSERT_LOCATION}}
// Microsoft Developer Studio will insert additional declarations immediately before the previous line.
#endif // !defined(AFX_SHELVPAGE_H__6F151624_D84D_11D2_96EE_006097CDB9E2__INCLUDED_)
<dp n="d158"/>
// ShelvPage.cpp:implementation file
//
#include"stdafx.h"
#include"sa.h"
#include "ShelvPage.h"
#include"TabDialog.h"
#include"DSP56kManager.h"
#ifdef_DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] =__FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CShelvPage property page
IMPLEMENT_DYNCREATE(CShelvPage,CPropertyPage)
CShelvPage::CShelvPage():CPropertyPage(CShelvPage::IDD)
{
//{{AFX_DATA_INIT(CShelvPage)
//}}AFX_DATA_INIT
}
CShelvPage::-CShelvPage()
{
}
void CShelvPage::DoDataExchange(CDataExchange* pDX)
{
CPropertyPage::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CShelvPage)
DDX_Control(pDX,IDC_CHECK3,m_BypassSecondButton);
DDX_Control(pDX,IDC_CHECK1,m_BypassFirstButton);
DDX_Control(pDX,IDC_SLIDER6,m_HiBoostSlider);
DDX_Control(pDX,IDC_SLIDET5,m_HiFreqSlider);
DDX_Control(pDX,IDC_SLIDER3,m_LoBoostSlider);
DDX_Control(pDX,IDC_SLIDER1,m_LoFreqSlider);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CShelvPage,CPropertyPage)
//{{AFX_MSG_MAP(CShelvPage)
ON_WM_VSCROLL()
ON_WM_SHOWWINDOW()
ON_WM_PAINT()
ON_BN_CLICKED(IDC_CHECK1,OnBypassFirst)
ON_BN_CLICKED(IDC_CHECK3,OnBypassSecond)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CShelvPage message handlers
BOOL CShelvPage::OnInitDialog()
{
CPropertyPage::OnInitDialog();
// TODO:Add extra initialization here
m_LoFreqSlider.SetRange(0,CONTROL_RANGE);
m_LoFreqSlider.SetPos(CONTRO_RANGE-g_DSPManager->GetParamValue(kLoShelfFreq));
m_LoFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_LoFreqSlider.SetPageSize(PG_CONTROL_AMT);
m_LoBoostSlider.SetRange(0.CONTROL_RANGE);
m_LoBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoShelfGain));
m_LoBoostSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_LoBoostSlider.SetPageSize(PG_CONTROL_AMT);
<dp n="d159"/>
m_HiFreqSlider.SetRange(0,CONTROL_RANGE);
m_HiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiShelfFreq));
m_HiFreqSlider.SetTicFreq((CONTROL_RANGE+1)/16):
m_HiFreqSlider.SetPageSize(PG_CONTROL_AMT);
m_HiBoostSlider.SetRange(0,CONTROL_RANGE);
m_HiBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiShelfGain));
m_HiBoostSlider.SetTicFreq((CONTROL_RANGE+1)/16);
m_HiBoostSlider.SetPageSize(PG_CONTROL_AMT);
m_ParentWindow=(CTabDialog*)GetParent()->GetParent();
return TRUE; // return TRUE unless you set the focus to a control
// EXCEPTION:OCX Property Pages should return FALSE
}
void CShelvPage::OnVScroll(UINT nSBCode,UINT nPos,CScrollBar*pScrollBar)
{
// TODO:Add your message handler code here and/or call default
CSliderCtrl *slider=(CSliderCtrl*)pScrollBar;
int which;
CPropertyPage::OnVScroll(nSBCode,nPos,pScrollBar);
Sleep(50);
if(slider==&m_LoFreqSlider)
which=kLoShelfFreq;
else if(slider==&m_LoBoostSlider)
which=kLoShelfGain;
else if(slider==&m HiFreqSlider)
which=kHiShelfFreq;
else if(slider==&m_HiBoostSlider)
which=kHiShelfGain;
else
return;
g_DSPManager->SetParamValue(CONTROL_RANGE-slider->GetPos(),which);
SendStringToUI(which);
}
void CShelvPage::SendStringToUI(int which)
{
CString str;
g_DSPManager->GetStringValue(which,str);
m_ParentWindow->SetStatusString(0,str);
}
void CShelvPage::OnShowWindow(BOOL bShow,UINT nStatus)
{
CPropertyPage::OnShowWindow(bShow,nStatus);
// TODO:Add your message handler code here
}
void CShelvPage::OnPaint()
{
CPaintDC dc(this);// device context for painting
// TODO:Add your message handler code here
m_LoFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoShelfFreq));
m_LoBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kLoShelfGain));
m_HiFreqSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiShelfFreq));
m_HiBoostSlider.SetPos(CONTROL_RANGE-g_DSPManager->GetParamValue(kHiShelfGain));
m_BypassFirstButton.SetCheck(g_DSPManager->GetBypassSection(kBypassLoshelf));
<dp n="d160"/>
m_BypassSecondButton.SetCheck(g_DSPManager->GetBypassSection(kBypassHiShelf));
// Do noT call CPropertyPage::OnPaint() for painting messages
}
void CShelvPage::OnBypassFirst()
{
// TODO:Add your control notification handler code here
int state=m_BypassFirstButton.GetState() & 0x3;
g_DSPManager->SetByassSection(state,kBypassLoshelf);
}
void CShelvPage::OnBypassSecond()
{
// TODO:Add your control notification handler code here
int state=m_BypassSecondButton.GetState() & 0x3;
g_DSPManager->SetBypassSection(state.kBypassHiShelf);
}
<dp n="d161"/>
//Microsoft Developer Studio generated resource script
//
#include"resource.h"
#define APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 2 resource.
//
#include"afxres.h"
/////////////////////////////////////////////////////////////////////////////
#undef APSTUDIO_READONLY_SYMBOLS
/////////////////////////////////////////////////////////////////////////////
// English (U.S.) resources
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef WIN32
LANGUAGE LANG ENGLISH,SURLANG ENGLISH US
#pragma code_page(1252)
#endif //_WIN32
#ifdef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// TEXTINCLUDE
//
1 TEXTINCLUDE DISCARDABLE
BEGIN
"resource.h\0"
END
2 TEXTINCLUDE DISCARDABLE
BEGIN
"#include""afxres.h""\r\n"
"\0"
END
3 TEXTINCLUDE DISCARDABLE
BEGIN
"#define _AFX_NO_SPLITTER_RESOURCES\r\n"
"#define _AFX_NO_OLE_RESOURCES\r\n"
"#define _AFX_NO_TRACKER_RESOURCES\r\n"
"#define _AFX_NO_PROPERTY_RESOURCES\r\n"
"\r\n"
"#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)\r\n"
"#ifdef_WIN32\r\n"
"LANGUAGE 9,1\r\n"
"#pragma code_page(1252)\r\n"
"#endif\r\n"
"#include""res\\sa.rc2"" // non-Microsoft Visual C++ edited resources\r\n"
"#include ""afxres.rc"" // Standard components\r\n"
"#endif\0"
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Icon
//
// Icon with lowest ID value placed first to ensure application icon
// remains consistent on all systems
IDR_MAINFRAME ICON DISCARDABLE "res\\sa.ico"
/////////////////////////////////////////////////////////////////////////////
//
// Dialog
<dp n="d162"/>
//
IDD_ABOUTBOX DrALOG DISCARDABLE 0,0,259,55
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION"About KOJ′s Amazing Town Crier"
FONT 8,"MS Sans Serif"
BEGIN
ICON IDR_MAINFRAME,IDC_STATIC,11,17,21,20
LTEXT "KOJ′s Amazing Town Crier Version 1.0",IDC_STATIC,40,10,
119,8,SS_NOPREFIX
LTEXT "Copyright(C)PMI 1999",IDC_STATIC,40,25,119,8
DEFPUSHBUTTON "OK",IDOK,220,7,32,14,WS_GROUP
END
IDD_SA_DIALOG DIALOGEX 0,0,229,175
STYLE DS_MODALFRAME | WS_POPUP | WS_VISIBLE | WS_CAPTION | WS_SYSMENU
EXSTYLE WS_EX_APPWINDOW
CAPTION"SuperAudio"
FONT 8,"MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,172,7,50,14
PUSHBUTTON "Cancel",IDCANCEL,172,23,50,14
PUSHBUTTON "Poke Sequence #1",IDC_BUTTON1,35,83,109,25
PUSHBUTTON "Poke Sequence #2",IDC_BUTTON2,33,123,115,28
END
IDD_DIALOG1 DIALOG DISCARDABLE 0,0,236,229
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION"KOJ's Amazing Town Crier"
MENU IDR_MENU1
FONT 8,"MS Sans Serif"
BEGIN
END
IDD_PP1 DIALOG DISCARDABLE 0,0,195,127
STYLE WS_CHILD | WS_DISABLED |WS_CAPTION
CAPTION"Test"
FONT8,"MS Sans Serif"
BEGIN
PUSHBUTTON "Send SPI Sequence #1",IDC_BUTTON1,57,36,86,22
PUSHBUTTON "Send SPI Sequence #2",IDC_BUTTON2,55,81,93,31
END
IDD_PP2 DIALOG DISCARDABLE 0,0,288,146
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Main"
FONT 8,"MS Sans Serif"
BEGIN
CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,58,25,22,86
LTEXT "Pre",IDC_STATIC,28,117,12,8
CONTROL "Bypass Processing",IDC_CHECK1,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,173,57,76,10
CONTROL "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,27,25,22,86
LTEXT "Post",IDC_STATIC,57,117,15,B
GROUPBOX "Volume",IDC_STATIC,19,15,135,118
CONTROL "Bypasss HDCD",IDC_CHECK2,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,173,74,76,10
CONTROL "Bypass HDCD Gain Scale",IDC_CHECK3,"Button",
BS_AUTOCHECKBOX | WS_TABSTOP,173,91,98,10
PUSHBUTTON "Reset All",IDC_BUTTON1,173,31,50,14
CONTROL "Analog Input",IDC_CHECK4,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,173,108,56,10
CONTROL "Slider1",IDC_SLIDER7,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,89,25,22,86
LTEXT "Analog",IDC_STATIC,85,117,23,8
CONTROL "Slider1",IDC_SLIDER8,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,119,25,22,86
LTEXT "Delay",IDC_STATIC,117,117,19,8
END
<dp n="d163"/>
IDD_PP3 DIALOG DISCARDABLE 0,0,195,127
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Compression"
FONT 8,"MS Sans Serif"
BEGIN
CONTROL "Bypass Compression",IDC_CHECK1,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,29,24,104,10
END
IDD_PP4 DIALOG DISCARDABLE 0,0,244,159
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Resonance Compensation"
FONT 8,"MS Sans Serif"
BEGIN
CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,20,24,20,85
CONTROL "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,48,24,21,85
CONTROL "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,76,24,20,85
LTEXT "Freq.",IDC_STATIC,17,113,20,11
LTEXT "Q",IDC_STATIC,51,113,8,11
LTEXT "Cut/Boost",IDC_STATIC,71,113,33,11
GROUPBOX "First Notch",IDC_STATIC,11,15,98,111
CONTROL "Slider1",IDC_SLIDER4,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,137,24,24,85
CONTROL "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,165,24,21,85
CONTROL "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,193,24,22,85
LTEXT "Freq.",IDC_STATIC,135,113,20,11
LTEXT "Q",IDC_STATIC,169,113,8,11
LTEXT "Cut/Boost",IDC_STATIC,189,113,32,11
GROUPBOX "Second Notch",IDC_STATIC,129,15,98,111
CONTROL "Bypass",IDC_CHECK5,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,33,136,39,10
CONTROL "Bypass",IDC_CHECK6,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,153,136,39,10
END
IDD_PP5 DIALOG DISCARDABLE 0,0,339,162
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Standing Wave Rejection"
FONT 8,"MS Sans Serif"
BEGIN
CONTROL "Slider1",IDC_SLIDER1;"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,20,24,20,85
CONTROL "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,48,24,21,85
CONTROL "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,76,24,20,85
LTEXT "Freq.",IDC_STATIC,17,113,20,11
LTEXT "Q",IDC_STATIC,51,113,8,11
LTEXT "Cut/Boost",IDC_STATIC,70,113,35,11
GROUPBOX "First Notch",IDC_STATIC,11,15,98,111
CONTROL "Slider1",IDC_SLIDER4,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,229,24,24,85
CONTROL "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,257,24,21,85
CONTROL "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,285,24,22,85
LTEXT "Freq.",IDC_STATIC,227,113,20,11
LTEXT "Q",IDC_STATIC,261,113,8,11
LTEXT "Cut/Boost",IDC_STATIC,280,113,34,11
GROUPBOX "Second Notch",IDC_STATIC,221,15,98,111
CONTROL "Slider1",IDC_SLIDER8,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,140,25,21,85
CONTROL "Slider1",IDC_SLIDER9,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,168,25,22,85
LTEXT "Q",IDC_STATIC,144,114,8,11
LTEXT "Cut/Boost",IDC_STATIC,163,114,34,11
GROUPBOX "Boost Compensation",IDC_STATIC,125,15,77,111
<dp n="d164"/>
CONTROL "Bypass",IDC_CHECK5,"Button".BS_AUTOCHECKBOX |
WS_TABSTOP,146,137,41,10
END
IDD_PP6 DIALOG DISCARDABLE 0,0,187,162
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Smiley-Face"
FONT 8,"MS Sans Serif"
BEGIN
CONTROL "Slider1".IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,20,24,20,85
CONTROL "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,50,24,20,85
LTEXT "Freq.",-1,17,113,20,11
LTEXT "Cut/Boost",-1,43,113,34,11
GROUPBOX "Lo-Shelf",-1,11,15,70,111
CONTROL "Slider1",IDC_SLIDER4,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,108,24,24,85
CONTROL "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,139,24,22,85
LTEXT "Freq.",-1,106,113,20,11
LTEXT "Cut/Boost",-1,134,113,33,11
GROUPBOX "Hi-Shelf",-1,100,15,69,111
CONTROL "Bypass",IDC_CHECK1,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,25,136,37,12
CONTROL "Bypass",IDC_CHECK3,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,115,136,37,12
END
IDD_PP7 DIALOG DISCARDABLE 0,0,242,162
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Cutoff Response"
FONT 8,"MS Sans Serif"
BEGIN
CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,20,24,20,85
CONTROL "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,48,24,21,85
CONTROL "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,76,24,20,85
LTEXT "Freq.",IDC_STATIC,17,113,20,11
LTEXT "Q",IDC_STATIC,51,113,8,11
LTEXT "Cut/Boost",IDC_STATIC,71,113,33,11
GROUPBOX "Low Cutoff",IDC_STATIC,11,15,98,111
CONTROL "Slider1",IDC_SLIDER4,,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,137,24,24,85
CONTROL "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,165,24,21,85
CONTROL "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,193,24,22,85
LTEXT "Freq.",IDC_STATIC,135,113,20,11
LTEXT "Q",IDC_STATIC,169,113,8,11
LTEXT "Cut/Boost",IDC_STATIC,189,113,32,11
GROUPBOX "High Cutoff",IDC_STATIC,129,15,98,111
CONTROL "Bypass",IDC_CHECK5,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,39,139,41,12
CONTROL "Bypass",IDC_CHECK6,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,154,139,41,12
END
IDD_PP8 DIALOG DISCARDABLE 0,0,285,164
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Cutoff Response"
FONT8,"MS Sans Serif"
BEGIN
CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,20,24,20,85
CONTROL "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,48,24,21,85
LTEXT "Freq.",-1,17,113,20,11
LTEXT "Q",-1,51,113,8,11
GROUPBOX "Low Cutoff",-1,11,15,71,111
<dp n="d165"/>
CONTROL "Slider1",IDC_SLIDER4,"mscttls_trackbar32",TBS_AUTOTICKS |
TBS_VERT TBS_VERT | WS_TABSTOP,112,24,24,85
CONTROL "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,140,24,21,85
LTEXT "Freq,",-1,110,113,20,11
LTEXT "Q",-1,144,113,8,11
GROUPBOX "High Cutoff",-1,104,15,69,111
CONTROL "Bypass",IDC_CHECK4,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,25,136,40,13
CONTROL "Bypass",IDC_CHECK5,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,116,136,40,13
CONTROL "Slider1",IDC_SLIDER8,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,203,25,24,85
CONTROL "Slider1",IDC_SLIDER9,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,231,25,21,85
LTEXT "Freq",-1,201,114,20,11
LTEXT "Q",-1,235,114,8,11
GROUPBOX "New High Cutoff",-1,195,15,69,111
CONTROL "Bypass",IDC_CHECK7,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,207,137,40,13
END
IDD_PP9 DIALOG DISCARDABLE 0,0,244,164
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Resonance Compensation #2"
FONT8,"MS Sans Serif"
BEGIN
CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,20,24,20,85
CONTROL "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,48,24,21,85
CONTROL "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,76,24,20,85
LTEXT "Freq.",IDC_STATIC,17,113,20,11
LTEXT "Q",IDC_STATIC,51,113,8,11
LTEXT "Cut/Boost",IDC_STATIC,71,113,33,11
GROUPBOX "Third Notch",IDC_STATIC,11,15,98,111
CONTROL "Slider1",IDC_SLIDER4,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,137,24,24,85
CONTROL "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,165,24,21,85
CONTROL "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,193,24,22,85
LTEXT "Freq.",IDC_STATIC,135,113,20,11
LTEXT "Q",IDC_STATIC,169,113,8,11
LTEXT "Cut/Boost",IDC_STATIC,189,113,32,11
GROUPBOX "Fourth Notch",IDC_STATIC,129,15,98,111
CONTROL "Bypass",IDC_CHECK5,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,36,139,40,12
CONTROL "Bypass",IDC_CHECK6,"Button",BS_AUTOCHECKBOX|
WS_TABSTOP,155,139,40,12
END
IDD_DIALOG2 DIAL,OG DISCARDABLE 0,0,175,66
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION"Dialog"
FONT 8,"MS Sans Serif"
BEGIN
PUSHBUTTON "Cancel",IDCANCEL,59,34,50,14
LTEXT "Initializing I2C. Please Wait.....",IDC_STATIC,43,17,
98,8
END
IDD_DIALOG3 DIALOG DISCARDABLE 0,0,186,132
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION"Dialog"
FONT 8,"MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,107,95,50,14
CONTROL "COM1",IDC_RADIO1,"Button",BS_AUTORADIOBUTTON,23,57,36,
10
CONTROL "COM2",IDC_RADIO2,"Button",BS_AUTORADIOBUTTON,23,70,36,
<dp n="d166"/>
10
CONTROL "COM3",IDC_RADIO3,"Button",BS_AUTORADIOBUTTON,23,82,36,
10
CONTROL "COM4",IDC_RADIO4,"Button",BS_AUTORADIOBUTTON,23,95,36,
10
LTEXT "Choose COM port and reset DSP board",IDC_STATIC,28,21,
125,8
GROUPBOX "COM Port",IDC_STATIC,15,45,68,69
END
IDD_DIALOG4 DIALOG DISCARDABLE 0,0,186,121
STYLE DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION"Dialog"
FONT 8,"MS Sans Serif"
BEGIN
DEFPUSHBUTTON "OK",IDOK,27,72,50,14
PUSHBUTTON "Quit App",IDD_BUTTON1,101,72,48,14
LTEXT "I2C communication error!",IDC_STATIC,49,25,79,8
EDITTEXT IDC_EDIT1,49,42,68,12,ES_AUTOHSCROLL
END
IDD_PP10 DIALOG DISCARDABLE 0,0,187,162
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Allpass"
FONT 8,"MS Sans Serif"
BEGIN
CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,20,24,20,85
CONTROL "Slider1",IDC_SLIDER3,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,50,24,20,85
LTEXT "Freq.",-1,17,113,20,11
LTEXT "Q",-1,53,113,8,8
GROUPBOX "Allpass",-1,11,15,70,111
CONTROL "Bypass",IDC_CHECK1,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,25,136,37,12
END
IDD_PP11 DIALOG DISCARDABLE 0,0,244,159
STYLE WS_CHILD | WS_DISABLED | WS_CAPTION
CAPTION"Double-Tuned Notch"
FONT 8,"MS Sans Serif"
BEGIN
CONTROL "Slider1",IDC_SLIDER1,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,20,24,20,85
CONTROL "Slider1",IDC_SLIDER2,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,48,24,21,85
LTEXT "Freq,",-1,17,113,20,11
LTEXT "Q",-1,51,113,8,11
GROUPBOX "Notch",-1,11,15,70,111
CONTROL "Slider1",IDC_SLIDER5,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,109,24,21,85
CONTROL "Slider1",IDC_SLIDER6,"msctls_trackbar32",TBS_AUTOTICKS |
TBS_VERT | WS_TABSTOP,137,24,22,85
LTEXT "Q",-1,113,113,8,11
LTEXT "Cut/Boost",-1,133,113,32,11
GROUPBOX "Compensation",-1,99,15,71,111
CONTROL "Bypass",IDC_CHECK5,"Button",BS_AUTOCHECKBOX |
WS_TABSTOP,73,136,39,10
END
#ifndef_MAC
/////////////////////////////////////////////////////////////////////////////
//
// Version
//
VS_VERSION_INFO VERSIONINFO
FILEVERSION 0,7,4,0
PRODUCTVERSION 0,7,4,0
FILEFLAGSMASK 0x3fL
#ifdef_DEBUG
<dp n="d167"/>
FILEFLAGS,0x1L
#else
FILEFLAGS 0x0L
#endif
FILEOS 0x4L
FILETYPE 0x1L
FILESUBTYPE 0x0L
BEGIN
BLOCK"StringFileInfo"
BEGIN
BLOCK"040904b0"
BEGIN
VALUE"CompanyName","Pacific Microsonics Inc.\0"
VALUE"FileDescription","sa MFC Application\0"
VALUE"FileVersion","0,7,4,0\0"
VALUE"InternalName","sa\0"
VALUE"LegalCopyright","Copyright (C) PMI 1999\0"
VALUE"OriginalFilename","sa.EXE\0"
VALUE"ProductName","sa Application\0"
VALUE"ProductVersion","0,7,4,0\0"
END
END
BLOCK"VarFileInfo"
BEGIN
VALUE"Translation",0x409,1200
END
END
#endif // !_MAC
/////////////////////////////////////////////////////////////////////////////
//
// DESIGNINFO
//
#ifdef APSTUDIO_INVOKED
GUIDELINES DESIGNINFO DISCARDABLE
BEGIN
IDD_ABOUTBOX,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,252
TOPMARGIN,7
BOTTOMMARGIN,48
END
IDD_SA_DIALOG,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,222
TOPMARGIN,7
BOTTOMMARGIN,168
END
IDD DIALOG1,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,229
TOPMARGIN,7
BOTTOMMARGIN,222
END
IDD PP1,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,188
TOPMARGIN,7
BOTTOMMARGIN,120
END
IDD_PP2,DIALOG
<dp n="d168"/>
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,281
TOPMARGIN,7
BOTTOMMARGIN,139
END
IDD_PP3,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,188
TOPMARGIN,7
BOTTOMMARGIN,120
END
IDD_PP4,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,237
TOPMARGIN,7
BOTTOMMARGIN,152
END
IDD_PP5,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,332
TOPMARGIN,7
BOTTOMMARGIN,155
END
IDD_PP6,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,180
TOPMARGIN,7
BOTTOMMARGIN,155
END
IDD_PP7,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,235
TOPMARGIN,7
BOTTOMMARGIN,155
END
IDD_PP8,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,278
TOPMARGIN,7
BOTTOMMARGIN,157
END
IDD_PP9,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,237
TOPMARGIN,7
BOTTOMMARGIN,157
END
IDD_DIALOG2,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,168
TOPMARGIN,7
BOTTOMMARGIN,59
END
IDD_DIALOG3,DIALOG
<dp n="d169"/>
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,179
TOPMARGIN,7
BOTTOMMARGIN.125
END
IDD_DIALOG4.DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,179
TOPMARGIN,7
BOTTOMMARGIN,114
END
IDD_PP10,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,180
TOPMARGIN,7
BOTTOMMARGIN,155
END
IDD_PP11,DIALOG
BEGIN
LEFTMARGIN,7
RIGHTMARGIN,237
TOPMARGIN,7
BOTTOMMARGIN,152
END
END
#endif // APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Menu
//
IDR_ENU1 MENU DISCARDABLE
BEGIN
POPUP"File"
BEGIN
MENUITEM"Open", ID_MENUITEM32771
MENUITEM"Save", ID_MENUITEM32772
MENUITEM"Export Param File", ID_FILE_EXPORTPARAMFILE
END
END
/////////////////////////////////////////////////////////////////////////////
//
// String Table
//
STRINGTABLE DISCARDABLE
BEGIN
IDS_ABOUTBOX "&About KOJ′s Amazing Town Crier..."
END
#endif // English(U.S.)resources
/////////////////////////////////////////////////////////////////////////////
#ifndef APSTUDIO_INVOKED
/////////////////////////////////////////////////////////////////////////////
//
// Generated from the TEXTINCLUDE 3 resource.
//
#define _AFX_NO_SPLITTER_RESOURCES
#define _AFX_NO_OLE_RESOURCES
<dp n="d170"/>
#define _AFX_NO_TRACKER_RESOURCES
#define _AFX_NO_PROPERTY_RESOURCES
#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
#ifdef _WIN32
LANGUAGE 9,1
#pragma code_page(1252)
#endif
#include"res\sa.rc2" // non-Microsoft Visual C++ edited resources
#include"afxres.rc" // Standard components
#endif
/////////////////////////////////////////////////////////////////////////////
#endif // not APSTUDIO_INVOKED
<dp n="d171"/>
opt cc,cex,cre,loc,so,mu,mex
DEFINE FAST ′1′
DEFINE M56362 ′1′
TABLE_COUNTER EQU 10
RUN_COUNTER EQU 10
INIT_COUNTER EQU 10
org y(10):$100
org p(10):$980
; **********************************************************
; **********************************************************
SECTION SUPER
; **********************************************************
; **********************************************************
; ------------------------------------------------------------
; HDCD detect and expand code
; ------------------------------------------------------------
include ′detect,asm′
include ′expgain,asm′
; **************************************************************************
; Adopted from Motorola sample code.
;
; **************************************************************************
page 132,60
include ′ioequ.asm′
include ′vectors.asm′
; include ′mbiquad.asm′
include ′mpeq.asm′
include ′mshelv.asm′
include ′mhipass.asm′
include ′mlopass.asm′
include ′allpass.asm′
list
CONFIGURE_SPI MACRO
; move #0,x0
; move x0,x:M_HSAR ;clear I2C address
;M_HCKR
;bits 13:12 HFM1:0 noise filter setting (off)
;bit 1 CPOL
;bit 0 CPHA
;
;00 xxxx xxxx xx01
; move #1,x0
; move #0,x0
; move x0,X;M_HCKR
; commented out code should yeild a value ot 0 ror M_HCKR.
;M_HCSR
;bit 13:12 HCSR HRIE
;bit 11 HCSR HTIE
;bit 10 HCSR HBIE
;bit 9 HCSR Idle(no care)
;bit 8:7 HRQE Host-request enable(asserted if ready to receive)
;bit 6 HMST Master mode(disabled)
;bit 5 HFIFO FIFO control(disabled)
;bit 4 HCKFR Clock freeze(off)
;bit 3:2 HM1:0 24 bit mode
;bit 1 HI2C Enables I2C mode
;bit 0 HEN Enable port
<dp n="d172"/>
;
;xx01 0010 000x 1001
move #$1209,x0
move x0,X:M_HCSR
;Get command to known value
move #SPITXDEF,x0
move x0,x:spixmit
; movep x:spixmit,x:M_HTX
ENDM
CONFIGURE_I2C MACRO
:turn off port
move #0,x0
move x0,X:M_HCSR
;leave address alone
; move #0,x0
; move x0,X:M_HSAR ;clear I2C address
; commented out code should yeild a value of 0 for M_HCKR.
;M_HCKR
;bits 13:12 HFM1:0 noise filter setting on
;
;11 xxxx xxxx xx00
move #>$3000,x0
move x0,X;M_HCKR
;M_HCSR
;bit 13:12 HCSR HRIE
;bit 11 HCSR HTIE
;bit 10 HCSR HBIE
;bit 9 HCSR Idle(no care)
;bit 8:7 HRQE Most-request enable(asserted if ready to receive)
;bit 6 HMST Master mode(disabled)
;bit 5 HFIFO FIFO control(disabled)
;bit 4 HCKFR Clock freeze(off)
;bit 3:2 HM1:0 24 bit mode
;bit 1 HI2C Enables I2C mode
;bit 0 HEN Enable port
;
;xx01 1100 101x 1010
move #$1CAA,x0
move x0,X:M_HCSR
;set command to known value
move #0,x0
move x0,x:spixmit
; movep x:spixmit,x:M_HTX
ENDM
XDEF fcontrol
XREF HDCD_DETECT_INIT,HDCD_DETECT,1sbcntl
XREF 1temp,rtemp
XREF dcontrol
XREF HDCD_GAIN_INIT,HDCD_DYNAMICS
XREF detect
XREF rmodel,bitcntl
SPITXDEF equ $444444
org xi:
DRX_BUFF_BASE ds 2
ARX_BUFF_BASE ds 2
TX_BUFF_BASE ds 4 ;unprocessed followed by processed data
;RX_PTR ds 1
TX_PTR ds 1
<dp n="d173"/>
flags ds 1
scnt ds 1
RightReccive equ 0
SPIReceivc equ 1
SPIOverrun equ 2
SPIFIFOFull equ 3
SPIUnderrun equ 4
SPITransmit equ 5
SPIStateBit equ 6
spixmit ds 1
spirecv ds 1
shisaveA1 ds 1
shisaveX0 ds 1
shisaveR4 ds 1
shisaveN4 ds 1
NADA ds 1
left ds 1
right ds 1
fcontrol ds 1
indexData ds 1
dpleft ds 1
dpright ds 1
stack ds 20
;interleaved delay line
;independently located
prg x(20):$200
DELAYLEN EQU128 ;2.9mS delay line
sdelayleft dsm DELAYLEN ;left
sdelayright dsm DELAYLEN ;right
org yi:
YNADA ds 1
volume ds 1
prefader ds 1
bypass ds 1
hdcdbp ds 1
gainscalebp ds 1
ddxcompbp ds 1
analogin ds 1
avolume ds 1
bypassmask ds 1
BYPASS_NOTCH1 EQU 0
BYPASS_NOTCH2 EQU 1
BYPASS_NOTCH3 EQU 2
BYPASS_NOTCH4 EQU 3
BYPASS_HIPASS EQU 4
BYPASS_LOPASS EQU 5
BYPASS_LOSHELV EQU 6
BYPASS_HISHELV EQU 7
BYPASS_CONECRY EQU 8
BYPASS_ALLPASS EQU 9
BYPASS_DBNOTCH EQU 10
BYPASS_NLOPASS EQU 11
delayval ds 1
; *********************************************
; EQ/filter declarations
; *********************************************
;smiley face shelf EQ
;left channel
DECLARE_LSH 1L,1.,-0.867
DECLARE_HSH 2L,1.,-0.867
;right channel
DECLARE_LSH 1R,1.,-0.867
DECLARE_HSH 2R,1.,-0.867
;resonance compensation PEQ
<dp n="d174"/>
;left channel
DECLARE_PEQ 1L,1.,-0.9510565,0.7265425
DECURE_PEQ 2L,1.,-0.91,0.5
DECLARE_PEQ 6L,1.,-0.9510565,0.7265425
DECLARE_PEQ 7L,1,-0.91,0.5
;riqht channel
DECLARE_PEQ 1R,1.,-0.91,0.5
DECLARE_PEQ 2R,1.,-0.91,0.5
DECLARE_PEQ 6R,1.,-0.9510565,0.7265425
DECLARE_PEQ 7R,1.,-0.91,0.5
;standing wave rejection PEQ
;left channel
DECLARE_PEQ 3L,1.,-0.9999803,0.9937365
DECLARE_PEQ 4L,1,,-0.91,0.5
DECLARE_PEQ 5L,1.,-0.91,0.5
;right channel
DECLARE_PEQ 3R,1.,-0.9999803,0.9937365
DECLARE_PEQ4R,1.,-0.91,0.5
DECLARE_PEQ 5R,1.,-0.91,0.5
;hi and lo pass filters
;left
DECLARE_HP hpleft,0.0099733,0.25,0.9987285 ;70 Hz
DECLARE_LP lpleft,1.1921856,0.6303886,1.4112871 ;14000 Hz/q=0.22
;right
DECLARE_HP hpright,0.0099733,0.25,0.9987285 ;70 Hz
DECLARE_LP lpright,1.1921856,0.6303886,1.4112871 ;14000 Hz
;new lopass
;left
DECLARE_LP lpleft2,1.,0.,0.
;right
DECLARE_LP lpright2,1.,0.,0.
;allpass filters
DECLRE_AP apleft,-0.91,0.5
DECLRE_AP apright,-0.91,0.5
;Keith new notch with 2 gain around it.
DECURE_PEQ NT1L,1.,-0.9999803,0.9937365
DECLARE_PEQ NT2L,1.,-0.91,0.5
DECLARE_PEQ NT3L,1.,-0.91,0.5
0ECLARE_PEQ NT1R,1.,-0.9999803,0.9937365
DECLARE_PEQ NT2R,1.,-0.91,0.5
DECLARE_PEQ NT3R,1.,-0.91,0.5
;**************************************************************************
org p:$100
START
main
ori #$03,mr ;mask interrupts
movep #$05000B,X:M_PCTL ;
move #0,omr ,
movec #0,sp ;reset hardware stack pointer
movep #$000003,x:M_IPRP ;ESAI int′s enabled and top Priority
movep #$000007,x:M_IPRP ;SHI (1) and ESAI (2) int′s enabled
move #stack,r6 ;initialize stack pointer
move #-1,m6 ;linear addressing
move #0,x0
move x0,x:DRX_BUFF_BASE
move x0,x:DRX_BUFF_BASE+1
move x0,x:ARX_BUFF_BASE
<dp n="d175"/>
move x0,x:ARX_BUFF_BASE+1
move x0,x:TX_BUFF_BASE
move x0,x:TX_BUFF_BASE+1
move x0,x:TX_BUFF_BASE+2
move x0,x:TX_BUFF_BASE+3
clr a
move a,x:flags
move a,x;scnt
;HDCD decoder initialize
move #>1,x0
move x0,x:fcontrol
move #>16,x0
move x0,x:lsbcntl
jsr HDCD_DETECT_INIT
move #>1,x0
move x0,x:dcontrol
jsr HDCD_GAIN_INIT
move #-1,m0
move #-1,m1
move #-1,m2
move #-1,m3
move #-1,m4
move #-1,m5
move #-1,m6
move #-1,m7
;set up volume and bypass switches
;output volume is set to zero sothat filter parameters can
;be downloaded,followed by volume being set
move &>$800000,x0
move x0,y:volume
move x0,y:prefader
move x0,y:avolume
move #>$7FFFFF,x0
move x0,y:bypass
move #>$0,x0
move x0,y:hdcdbp
move x0,y:gainscalebp
move x0,y:ddxcompbp
move x0,y:analogin
move x0,y:bypassmask
move x0,y:delayval
move x0,x:indexData
move #>sdelayleft,x0
move x0,x:dpleft
move #>sdelayright,x0
move x0,x:dpright
;initialize EQ params
INIT_PEQ_PARAM 1L
INIT_PEQ_PARAM 1R
INIT_PEQ_PARAM 2L
INIT_PEQ_PARAM 2R
INIT_PEQ_PARAM 3L
INIT_PEQ_PARAM 3R
INIT_PEQ_PARAM 4L
INIT_PEQ_PARAM 4R
INIT_PEQ_PARAM 5L
INIT_PEQ_PARAM 5R
INIT_PEQ_PARAM 6L
INIT_PEQ_PARAM 6R
INIT_PEQ_PARAM 7L
INIT_PEQ_PARAM 7R
INIT_PEQ_PARAM NT1L
INIT_PEQ_PARAM NT2L
INIT_PEQ_PARAM NT3L
<dp n="d176"/>
INIT_PEQ_PARAM NT1R
INIT_PEQ_PARAM NT2R
INIT_PEQ_PARAM NT3R
INIT_SH_PARAM 1L
INIT_SH_PARAM 1R
INIT_SH_PARAM 2L
INIT_SH_PARAM 2R
INIT_LP_PARAM lpleft
INIT_LP_PARAM lpright
INIT_LP2_PARAM lpleft2
INIT_LP2_PARAM lpright2
INIT_AP_PARAM apleft
INIT_AP_PARAM apright
;hi-pass does not need initializing as all params are downloaded
;setup serial host interface
;;CONFIGURE_SPI
CONFIGURE_I2C
;------------------------------------------------------------
; FST/FSR and SCKT/SCKR are generated from the PLD
; and fed to the DSP,A/D and D/A converters
;------------------------------------------------------------
;put esai in reset state.
; IF @DEF(′ANALOGIN′)==0
movep #$000000,x;M_PCRC ; MLS 12/20/97
movep #$000000,x;M_PRRC ; MLS 12/20/97
; ENDIF
movep #$0c0200.x:M_TCCR
;FST is input (bit22=0)
;external clock source drives SCKT (bit21=0)
;negative FST polarity (bit19=1)
;data & FST clocked out on rising edge (bit18=1)
;2 words per frame (bit13:9=00001)
movep #$0C0200.x:M_RCCR
;FSR is input (bit22=0)
;external clock source drives SCKR (bit21=0)
;negative FSR polarity (bit19=1)
;data & FSR clocked in on rising edge (bit18=0)BAK(121997)
;2 words per frame (bit13:9=00001)
movep #$000000,x:M_SAICR
<dp n="d177"/>
movep #Sd17D03,x:M_RCR
;Rx1,RX0 enabled (bit1:0=11)
;Rx2,RX3 disabled (bit3:2=00)
;reserved (bit5:4=00)
;MSB shifted first (bit6=0)
;word left-aligned (bit7=0)
;network mode (bit9:8=01)
;32-bit slot length,24-bit word length (bit14:10=11111)
;word-length frame sync (bit15=0)
;frame sync occurs 1 clock cycle earlier (bit16=1)
;reserved (bit19:17=000)
;RLIE,RIE,REIE enabled (bit23:20=0101)
;bit23 RLIE
;bit22 RIE
;bit21 REDIE
;bit20 REIE
movep #Sd13d00,x:M_TCR ;MLS 12/20/97
;TX0,TX1 enabled (bit3:0=0011)
;TX2,TX3,TX4,TX5 disabled (bit5:4=00)
;MSB shifted first (bit6=0)
;word left-aligned (bit7=0)
;network mode (bit9:8=01)
;32-bit slot length,24-bit word length (bit14:10=11111)
;word length frame sync (bit15=0)
;frame sync occurs 1 clock cycle earlier (bit16=0 )
;reserved (bit19:17=000)
;TLIE,TIE,TEIE enabled (bit23:20=0101)
;bit23 TLIE.
;bit22 TIE
;bit21 TEDIE
;bit20 TEIE
movep #$000edb,x:M_PCRC ;MLS 12/20/97
movep #$000edb,x:M_PRRC ;MLS 12/20/97
movep #$ffffff,x:M_RSMA ;MLS 12/20/97
movep #$ffffff,x:M_RSMB ;MLS 12/20/97
movep #$000003,x:M_TSMA
movep #$000003,x:M_TSMB
movep #$000000,x:M_TX0 ;zero out transmitter 0
movep #$000000,x:M_TX1 ;zero out transmitter 1
movep #$000000,x:M_TX2 ;zero out transmitter 2
movep #$000000,x:M_TX3 ;zero out transmitter 3
bset #0,x:M_TCR ;now enable TX0
bset #1,x:M_TCR ;now enable TX1
bset #2,x:M_TCR ;now enable TX2
bset #3,x:M_TCR ;now enable TX3
bset #2,x:M_RCR ;RE2 and TE3 must be set to enable
;TX3 and disable RX2
;turn on serial host interface
bset #0,X:M_HCSR
andi #$FC,mr ;enable all interrupt levels
;clear scaling bits
bclr #RightReceive,X:flags
; jclr #RightReceive,X:flags,*
; bclr #RightReceive,X:flags
; jclr #RightReceive,X:flags,*
; move #>RX_BUFF_BASE,x0
; move x0,x:RX_PTR
; move #>TX_BUFF_BASE,x0
; move x0,x:TX_PTR
;------------------------------------------------------------
;Main loop
;------------------------------------------------------------
LOOP
<dp n="d178"/>
jclr #RightReceive,x:flags,*
bclr #RightReceive,x:flags
btst #22,y:analogin
.IF <CC>
move x:DRX_BUFF_BASE,x0 ;receive left
move x:DRX_BUFF_BASE+1,x1 ;receive right
.ELSE
move x:ARX_BUFF_BASE,x0 ;receive left
move x:ARX_BUFF_BASE+1,x1 ;receive right
.ENDI
;store unprocessed(with volume)output first
move y:avolume,y0
mpyr y0,x0,a
mpyr y0,x1,b
;MM 5/20/99 Swapped channels
tfr x0,a a,x:TX_BUFF_BASE+2 ;transmit left
tfr x1,b b,x:TX_BUFF_BASE ;transmit right
;write input into delay line
move #DELAYLEN-1,m0
move #DELAYLEN-1,m1
move x:dpleft,r0
move x:dpright,r1
move y:delayval,y0
move #>DELAYLEN,x0
mpy x0,y0,a a,x:(r0)-
move b,x:(r1)-
move a,n0
move a,n1
move x:(r0+n0),a
move x:(r1+n1),b
move #-1,m0
move #-1,m1
move r0,x:dpleft
move r1,x:dpright
JSR STEREO_PROCESS
;MM 5/20/99 Swapped channels
move b,x:TX_BUFF_BASE+1 ;transmit left
move a,x:TX_BUFF_BASE+3 ;transmit right
move #>1,x0
move x:scnt,a
add x0,a
move a1,x:scnt ;don′t saturate
jmp LOOP
;------------------------------------------------------------
; Subroutines
;------------------------------------------------------------
STEREO_PROCESS
move a,x:left
move b,x:right
;copy parameters from left channel EQs to right channel EQs
COPY_SH_PARAM 1L,1R
COPY_SH_PARAM 2L,2R
COPY_PEQ_PARAM 1L,1R
COPY_PEQ_PARAM 2L,2R
COPY_PEQ_PARAM 3L,3R
COPY_PEQ_PARAM 4L,4R
COPY_PEQ_PARAM 5L,5R
COPY_PEQ_PARAM 6L,6R
COPY_PEQ_PARAM 7L,7R
<dp n="d179"/>
COPY_PEQ_PARAM NT1L,NT1R
COPY_PEQ_PARAM NT2L,NT2R
COPY_PEQ_PARAM NT3L,NT3R
COPY_HP_PARAM hpleft,hpright
COPY_LP_PARAM lpleft,lpright
COPY_LP_PARAM lpleft2,lpright2
COPY_AP_PARAM apleft,apright
;HDCD processing
jset #22,y:hdcdbp,doeq
move x:left,a
move x:right,b
move a,x;ltemp
move b,x:rtemp
clr b
move #>1,x0
move y:gainscalebp,a
tst a
teq x0,b
move b1,x:dcontrol
jsr HDCD_DETECT
;destroy code
move #>3,x0
move x:rmodel,a
cmp x0,a
bne skip_code_dest
move #>8,x0
move x:bitcntl,a
cmp x0,a
bne skip_code_dest
move x:ltemp,a
eor #>$000100,a
move a,x:ltemp
move a,x:left
skip_code_dest:
move #-1,m0
move #-1,m4
move #4,n4
jsr HDCD_DYNAMICS
move x:ltemp,a
move x:rtemp,b
btst #22,y:hdcdbp
.IF <CC>
move a,x:left
move b,x:right
move x:detect,x0
move x0,x:spixmit
.ELSE
move #0,x0
move x0,x:spixmit
.ENDI
; jmp doeq1
;doeq:
;
; move # 0,x0
; move x0,x:spixmit
doeq1:
jset #22,y:bypass,dopostvol
move x:left,x1
<dp n="d180"/>
move x:right,y1
move y:prefader,x0
mpyr -x0,x1,a
mpyr -x0,y1,b
tfr a,b b,x:right
;smiley face
jset #BYPASS_LOSHELV,y:bypassmask,_skiplsl
LSH 1L
_skiplsl
jset #BYPASS_HISHELV,y:bypassmask,_skiphsl
HSH 2L
_skiphsl
;cut-off response
jset #BYPASS_HIPASS,y:bypassmask,_skiphpl
HP hpleft
_skiphpl
jset #BYPASS_LOPASS,y:bypassmask,_skiplp1
LP lpleft
_skiplp1
jset #BYPASS_NLOPASS,y:bypassmask,_skiplp2l
LP lpleft2
_skiplp2l
;resonance EQ
jset #BYPASS_NOTCH1,y:bypassmask,_skip1l
PEQ 1L
_skip1l
_ jset #BYPASS_NOTCH2,y:bypassmask,_skip2l
PEQ 2L
_skip2l
jset #BYPASS_NOTCH3,y:bypassmask,_skip3l
PEQ 6L
_skip3l
jset #BYPASS_NOTCH4,y:bypassmask,_skip4l
PEQ 7L
_skip4l
;cone-cry
jset #BYPASS CONECRY,y:bypassmask,_skipccl
PEQ 5L
PEQ 3L
PEQ 4L
_skipccl
;double-tuned notch
jset #BYPASS_DBNOTCH,y:bypassmask,_skipdbnl
PEQ NT1L
PEQ NT2L
PEQ NT3L
_skipdbnl
;all-pass
jset #BYPASS_ALLPASS,y:bypassmask,_skipapl
AP apleft
_skipapl
move b,x:left
move x:right,b
; smiley face
jset #BYPASS_LOSHELV,y:bypassmask,_sklpisr
LSH 1R
_skiplsr
jset #BYPASS_HISHELV,y:bypassmask,_skiphsr
HSH 2R
_skiphsr
;cut-off response
jset #ByPASS_HIPASS,y:bypassmask ,_skiphpr
HP hpright
_skiphpr
jset #BYPASS_LOPASS,y:bypassmask,_skiplpr
LP lpright
_skiplpr
jset #BYPASS_NLOPASS,y:bypassmask,_skiplp2r
<dp n="d181"/>
LP lpright2
_skiplp2r
;resonance EQ
jset #BYPASS_NOTCH1,y:bypassmask,_skip1r
PEQ 1R
_skip1r
jset #BYPASS_NOTCH2,y:bypass mask,_skip2r
PEQ 2R
_skip2r
jset #BYPASS_NOTCH3,y:bypassmask,_skip3r
PEQ 6R
_skip3r jset #BYPASS_NOTCH4,y:bypassmask,_skip4r
PEQ 7R
_skip4r
;cone-cry
jset #BYPASS_CONECRY,y:bypassmask,_skipccr
PEQ 5R
PEQ 3R
PEQ 4R
_skipccr;
;double-tuned notch
jset #BYPASS_DBNOTCH,y:bypassmask,_skipdbnr
PEQ NT1R
PEQ NT2R
PEQ NT3R
_skipdbnr
; all-pass
jset #BYPASS_ALLPASS,y:bypassmask,_skipapr
AP apright
_skipapr
move b,x:right
dopostvol:
plainvol:
move y:volume,y0
move x:left,x0
move x:right,xl
mpyr -x0,y0,a
mpyr -x1,y0,b
rts
<dp n="d182"/>
org xi:
org yi:
org p:
;------------------------------------------------------------
; SHI interrupts
:-----------------------------------------------------------
; ; ---- SHI/I2C receive ISR
shi_rx_isr
move a1,x:shisaveA1
move x0,x:shisaveX0
move r4,x:shisaveR4
move n4,x:shisaveN4
movep x:M_HRX,a1
jset #SPIStateBit,x:flags,_gotData
;got index
move a1,x:indexData
bset #SPIStateBit,x:flags
jmp _exitInt
;got data
_gotData:
move x:indexData.n4
move #pptrs.r4
<dp n="d183"/>
bclr #SPIstateBit.x:flags
movem p:(r4+n4),r4
move a1,y:(r4)
_exitInt:
move x:shisaveA1,a1
move x:shisaveX0,x0
move x:shisaveR4,r4
move x:shisaveN4,n4
rti
;---- SHI/I2C receive overrun error
shi_rxe_isr
movep x:M_HCSR,x:NADA
movep x:M_HRX,x:NADA
bset #SPIOverrun,x:flags
bclr #SPIStateBit,x:flags
rti
: SHI Receive FIFO Full
shi_rxf_isr
movep x:M_HCSR,x:NADA
movep x:M_HRX,x:NADA
bset #SPIFIFOFull,x:flags
bclr #SPIStateBit,x:flags
rti
; SHI Transmit Data
shi_txu_isr ;SHI Transmit Underrun Error
bset #SPIUnderrun,x:flags
movep x:M_HCSR,x:NADA
movep x:spixmit,x:M_HTX
bclr #SPIStateBit,x:flags
rti
shi_tx_isr:
movep x:spixmit,x:M_HTX
bset #SPITransmit,x:flags
rti
;SHI Bus Error
shi_bus_error:
; movep x:M_HCSR,x:NADA
; bset #SPIReceive+4,x:flags
;reset shi
bclr #0,x:M_HCSR
nop
nop
bset #0,x:M_HCSR
bclr #SPIStateBit,x:flags
nop
rti
;------------------------------------------------------------
; Subroutines
;-----------------------------------------------------------
; include′isr_dig.asm′
;------------------------------------------------------------
; Interrupt Service Routines
;------------------------------------------------------------
esai_txe_isr ;ESAI TRANSMIT ISR
bclr #14,x:M_SAISR ;Read SAISR to clear transmit
;underrun error flag
esai_tx_isr
jset #13,x:M_SAISR,TxLeftSlot
movep x:TX_BUFF_BASE+2,x:M_TX1 ;write unprocessed data
movep x:TX_BUFF_BASE+3,x:M_TX0
movep x:TX_BUFF_BASE+3,x:M_TX2
<dp n="d184"/>
movep x:TX_BUFF_BASE+3,x:M_TX3
rti
TxLeftSlot
movep x:TX_BUFF_BASE,x:M_TX1 ;write unprocessed data
movep x:TX_BUFF_BASE+1,x:M_TX0
movep x:TX_BUFF_BASE+1,x:M_TX2
movep x:TX_BUFF_BASE+1,x:M_TX3
rti
esai_txls_isr ;ESAI TRANSMIT LAST SLOT ISR
; move r0,x:(r6)+ ;Save r0 to the stack
; move #TX_BUFF_BASE,r0 ;Reset pointer
; move r0,x:TX_PTR ;Reset tx buffer pointer just in
; ;case it was corrupted
; move x:-(r6),r0 ;Restore r0
rti
esai_rxe_isr ;ESAI RECEIVE ISR
bclr #7,x:M_SAISR ;Read SAISR to clear receive
overrun error flag
;overrun error flag
esai_rx_isr
jset #$6,x:M_SAISR,LeftSlot
bset #RightReceive,x:flags ;if right channel data then set flag
movep x:M_RX0,x:ARX_BUFF_BASE+1
movep x:M_RX1,x:DRX_BUFF_BASE+1
rti
LeftSlot
movep x:M_RX0,x:ARX_BUFF_BASE
movep x:M_RX1,x:DRX_BUFF_BASE
rti
esai_rxls_isr ;ESAI RECEIVE LAST SLOT ISR
; move r0,x;(r6)+ ;Save r0 to the stack
; move #RX_BUFF_BASE,r0 ;Reset rx buffer pointer just in
;case it was corrupted
; move r0,x;RX_PTR ;Update rx buffer pointer
; move x:-(r6),r0 ;Restore r0
rti
; variable look up table
pptrs
dc volume
dc sh_gamma_1L
dc sh_k_1L
dc sh_gamma_2L
dc sh_k_2L
dc peq_gamma_1L
dc peq_beta_1L
dc peq_k_1L
dc peq_gamma_2L
dc peq_beta_2L
dc peq_k_2L
dc peq_gamma_3L
dc peq_beta_3L
dc peq_k_3L
dc peq_gamma_4L
dc peq_beta_4L
dc peq_k_4L
dc peq_gamma_5L
dc peq_beta_5L
dc peq_k_5L
dc prefader
dc bypass
dc hp_scale_hpleft
dc hp_fc_hpleft
dc hp_qc_hpleft
<dp n="d185"/>
dc lp_scale_lpleft
dc lp_a2_lplefc
dc lp_a1_lpleft
dc hdcdbp
dc gainscalebp
dc ddxcompbp
dc peq_gamma_6L
dc peq_beta_6L
dc peq_k_6L
dc peq_gamma_7L
dc peq_beta_7L
dc peq_k_7L
dc analogin
dc avolume
dc bypassmask
dc delayval
dc ap_gamma_apleft
dc ap_beta_apleft
dc lp_scale_lpleft2
dc lp_a2_lpleft2
dc lp_a1_lpleft2
; dc lp_b2_lpleft2
; dc lp_b1_lpleft2
dc peq_gamma_NT1L
dc peq_beta_NT1L
dc peq_k_NT1L
dc peq_gamma_NT2L
dc peq_beta_NT2L
dc peq_k_NT2L
dc peq_gamma_NT3L
dc peq_beta_NT3L
dc peq_k_NT3L
dc YNADA
dc YNADA
dc YNADA
ENDSEC
end
<dp n="d186"/>
SH_SCALE_FACTOR EQU 3
SH_SCALE_DIVIDE EQU (1<<SH_SCALE_FACTOR)
;
; k is gain
; k=0 =>lo/hi pass filter
; 0<k<1 =>cut
; k=1 =>pass-thru
; k>1 =>boost
;
; gamma drives critical frequency
;
;
DECLARE_LSH_MACRO name,k,gamma
org xi;
sh_x_\name dc 0 ;x(n-1)
sh_y_\name dc 0 ;y(n-1)
org yi:
sh_gamma_\name dc gamma
sh_minus_one_\name dc -1,0
sh_k\name dc k/SH_SCALE_DIVIDE
sh_1_\name dc 1./SH_SCALE_DIVIDE
ENDM
DECLARE_HSH MACRO name,k,gamma
DECLARE_LSH name,k,gamma
ENDM
COPY_SH_PARAM MACRO from,to
move y:sh_gamma_\from,x0
move x0,y:sh_gamma_\to
move y:sh_k_\from,x0
move x0,y:sh_k_\to
ENDM
INIT_SH_PARAM MACRO name
move #>(-1,0),x0
move x0,y:sh_minus_one_\name
move #>(1./SH_SCALE_DIVIDE),x0
move x0,y:sh_k_\name
move x0,y:sh_1_\name
ENDM
;
; input data is in x0
; input is scaled by 0.5 to prevent internal clipping in the all-pass
;
; computes all-pass:
;
; y(n)=-gamma*x(n)-x(n-1)-gamma*y(n-1)(lo-shelv)
; y(n)=gamma*x(n)+x(n-1)-gamma*y(n-1)(hi-shelv)
;
; all-pass output is scaled by gain:
;
; output=((1+k)/2)*x(n)+((1-k)/2)*y(n)
;
; assumes:
; m0,m4,m5=-1
;
;
<dp n="d187"/>
LSH MACRO name
asr b #sh_gamma_\name,r4
rnd b #sh x\name,r0
move b,x0 y:(r4)+,y0
;compute y(n)
mpy -x0,y0,b x:(r0)+,x1 y:(r4)+,y1
mac x1,y1,b x:(r0)-,x1
macr -y0,x1,b x0,x:(r0)+ y:(r4)+,y0
;all-pass output in b,now scale by gain/cut factor
mpy x0,y0,b b,x:(r0)- b,y1
mac -y1,y0,b y:(r4)+,y0
mac x0,y0,b
mac y1,y0,b
;now scale output to get real result
asl #(SH SCALE FACTOR),b,b
rnd b
ENDM
HSH MACRO name
asr b #sh_gamma_\name,r4
rnd b #sh x\name,r0
move b,x0 y:(r4)+,y0
;compute y(n)
mpy x0,y0,b x:(r0)+,x1 y:(r4)+,y1
mac -x1,y1,b x:(r0)-,x1
macr -y0,x1,b x0,x:(r0)+ y:(r4)+,y0
;all-pass output in b,now scale by gain/cut factor
mpy x0,y0,b b,x:(r0)- b,y1
mac -y1,y0,b y:(r4)+,y0
mac x0,y0,b
mac y1,y0,b
;now scale output to get real result
asl #(SH SCALE FACTOR),b,b
rnd b
ENDM
<dp n="d188"/>
PEQ_SCALE_FACTQR EQU 3
PEQ_SCALE_DIVIDE EQU(1<<PEQ_SCALE_FACTOR)
;
; k is gain
; k=0 => notch filter
; 0<k<1 =>cut
; k=1 =>pass-thru
; k>1 =>boost
;
; gamma drives critical frequency
;
; beta defines Q
;
DECLARE_PEQ MACRO name,k,gamma,beta
org xi:
peq_y_\name dc 0
dc 0
pe_q_x_\name dc 0
dc 0
org yi:
peq_gammma_\name dc gamma
peq_beta_\name dc beta
peq_k_\name dc k/PEQ_SCALE_DIVIDE
peq_1_\name dc 1./PEQ_SCAE_DIVIDE
peq_v_\name dc 0
peq_w_\name dc 0
ENDM
COPY_PEQ_PARAM MACRO from,to
move y:peq_gamma_\from,x0
move x0,y:peq_gamma_\to
move y:peq_beta_\from,x0
move x0,y:peq_beta_\to
move y:peq_k_\from,x0
move x0,y:peq_k_\to
ENDM
INIT_PEQ_PARAM MACRO name
move #>(1./PEQ_SCALE_DIVIDE),x0
move x0,y:peq_k_\name
move x0,y:peq_1_\name
ENDM
; input data is in b
; input is scaled by 0.5 to prevent internal clipping in the all-pass
;
; computes all-pass:
; v(n) = gamma *y(n-1)+y(n-2)-gamma*v(n-1)
; w(n)=gamma*x(n-1)+x(n-2)-gamma*w(n-1)
; y(n)=w(n)+beta*x(n)-beta*v(n)
;
; all-pass output is scaled by gain:
;
; output=((1+k)/2)*x(n)+((1-k)/2)*y(n)
; assumes:
; m0,m4,m5=-1
;
;
<dp n="d189"/>
PEQ MACRO name
asr b #peq_y_\name,r0
move #peq_gamma_\name,r4
move #peq_v_\name,r5
move b,x0
move x:(r0)+,a y:(r4)+,y0
move x:(r0)+,x1 y:(r5)+,y1
;compute v(n)
mac x1,y0,a x:(r0)+,b
mac -y1,y0,a x:(r0),x1 y:(r5),y1
;compute w(n),v(n)is now in a
mac x1,y0,b a,x1 a,y:(r5)+
mac -y1,y0,b x:(r0),a y:(r4)+,y0
;compute y(n),w(n)is now in b
mac -x1,y0,b x0,x:(r0)- b,y:(r5)-
mac x0,y0,b a,x:(r0)- y:(r4)+,y0
;all-pass output in b,now scale by gain/cut factor
mpy x0,y0,b x:(r0)-,a b,y1
mac -y1,y0,b y:(r4)+,y0
mac x0,y0,b a,x:(r0)+
mac y1,y0,b y1,x:(r0)-
;now scale output to get real result
asl #(PEQ_SCALE_FACTOR),b,b
rnd b
ENDM
<dp n="d190"/>
LP_SCALE_FACTOR EQU 6
LP_SCALE_DIVIDE EQU(1<<LP_SCALE_FACTOR)
;
;
: modified chamberlin lo-pass(both x(n)and x(n-1))
;
; q also defines gain
; input is scaled to avoid internal clipping
;
; f=2*sin(w/2) f only valid when less than 1.
;
; 0<q<1
;
; implemented as a direct form biquad with coefficients and data scaled.
; needs headroom for gain
;
DECLARE_LP MACRO name,ca1,ca2,cb
org xi:
lp_w_\name ds 2
org yi:
lp_scale_\name dc cb/16.
lp_a2_\name dc ca2/2.
lp_a1_\name dc ca1/2.
lp_b2_\name dc 0.0
lp_b1_\name dc 1.0/2.
ENDM
COPY_LP_PARAM MACRO from,to
move y:lp_scale_\from,x0
move x0,y:lp_scale_\to
move y:lp_a2_\from,x0
move x0,y:lp_a2_\to
move y:lp_a1_\from,x0
move x0,y:lp_al_\to
move y:lp_b2_\from,x0
move x0,y:lp_b2_\to
move y:lp_b1_\from,x0
move x0,y:lp_b1_\to
ENDM
INIT_LP_PARAM MACRO name
move #0,x0
move x0,y:lp_b2_\name
move x0,y:lp_a2_\name
move x0,y:lp_a1_\name
move x0,y:lp_b1_\name
move #>(1./16.),x0
move x0,y :lp_scale_\name
ENDM
INIT_LP2_PARAM MACRO name
move #0,x0
move x0,y:lp_a2_\name
move x0,y:lp_a1_\name
move #>0.5,x0
move x0,y:lp_b2_\name
move #>1.,x0
move x0,y:lp_b1_\name
<dp n="d191"/>
move #>(0 25/16.),x0
move x0,y:1p_scale_\name
ENDM
;
; assumes:
; m0,m4,m5=-1
;
;
LP MACRO name
move b,x0
ori #8,mr
move #lp_scale_\name,r4
move #lp_w_\name,r0
move y:(r4)+,y0 ;x0=x(n),y0=0.5
mpy x0,y0,b x:(r0)+,x0 y:(r4)+,y0 ;x0=w(n-2),y0=a2
mac -x0,y0,b x:(r0)-,x1 y:(r4)+,y0 ;x1=W(n-1),y0=a1
macr -x1,y0,b x1,x:(r0)+ y:(r4)+,y0 ;w(n-2)= w(n-1),y0=b2
mac x0,y0,b b,x:(r0)- y:(r4)+,y0 ;w(n-1)= a,y0=b1
macr x1,y0,b
andi #SF7,mr
asl #4,b,b
ENDM
<dp n="d192"/>
HP_SCALE_FACTOR EQU 6
HP_SCALE_DIVIDEEQU (1<<HP_SCALE_FACTOR)
;
;
; chamberlin hi-pass(from lopass)
;
; q also defines gain
; input is scaled to avoid internal clipping
;
; f=2*sin(w/2) f only valid when less than 1.
;
; 0<q<1
;
; implemented as a direct form biquad with coefficients and data scaled.
; needs headroom for gain
;
DECLARE_HP MACRO name,fc,qc,scale
org xi:
hp_s2_\name ds 1
hp_y_\name ds 1
org yi:
hp_scale_\name dc (-0.5*scale)
hp_fc_\name dc fc
hp_qc_\name dc qc
ENDM
COPY_HP_PARAM MACRO from,to
move y:hp_scale_\from,x0
move x0,y:hp_scale_\to
move y:hp_fc_\from,x0
move x0,y:hp_fc_\to
move y:hp_qc_\from,x0
move x0,y:hp_qc_\to
ENDM
;
; assumes:
; m0,m4,m5=-1
;
;
HP MACRO name
move #hp_scale_\name,r4
move #hp_s2_\name,r0
move b,x0 y:(r4)+,y0 ;y0=scale
;a=x(n)*acale
mpy -y0,x0,a x:(r0)+,x1 y:(r4)+,y0 ;y0=fc
;b=s2(n-1)*fc
mpyr x1,y0,b x:(r0),x0 y:(r4)+,y1 ;y1=qc
;b = s2(n-1)*fc+y(n-1)
add x0,b
;a=x(n)-s2(n-1)*fc-y(n-1)
sub b,a b,x:(r0)
;a=s1(n)=x(n)-s2(n-1)*fc-y(n-1)-qc*s2(n-1)
macr -x1,y1,a x1,b
move a,x0
;b=s2(n)=s2(n-1)+fc*s1(n)
macr x0,y0,b x:(r0)-,x0
<dp n="d193"/>
IF @DEF(′LO′)
tfr x0,b b,x:(r0)
EL5E
tfr a,b b,x:(r0)
ENDIF
asl b
ENDM
<dp n="d194"/>
AP_SCALE_FACTOR_EQU 3
AP_SCALE_DIVIDE EQU(1<<AP_SCALE_FACTOR)
;
; gamma drives critical frequency
;
; beta defines Q
;
DECLARE_AP MACRO name,gamma,beta
org xi:
ap_y_\name dc 0
dc 0
ap_x_\name dc 0
dc 0
org yi:
ap_gamma_\name dc gamma
ap_beta_\name dc beta
ap_v_\name dc 0
ap_w_\name dc 0
ENDM
COPY_AP_PARAM MACRO from,to
move y:ap_gamma_\from,x0
move x0,y:ap_gamma_\to
move y:ap_beta_\from,x0
move x0,y:ap_beta_\to
ENDM
INIT_AP_PARAM MACRO name
ENDM
;
; input data is in b
; input is scaled by 0.5 to prevent internal clipping in the all-pass
;
; computes all-pass:
;
; v(n)=gamma*y(n-1)+y(n-2)-gamma*v(n-1)
; w(n)=gamma*x(n-1)+x(n-2)-gamma*w(n-1)
; y(n)=w(n)+beta*x(n)-beta*v(n)
;
; assumes:
; m0,m4,m5=-1
;
;
AP MACRO name
asr b #ap_y_\name,r0
move #ap_gamma_\name,r4
move #ap_v_\name,r5
move b,x0
move x:(r0)+,a y:(r4)+,y0
move x:(r0)+,x1 y:(r5)+,y1
:compute v(n)
mac x1,y0,a x:(r0)+,b
mac -y1,y0,a x:(r0),x1 y:(r5)-,y1
;compute w(n),v(n)is now in a
mac x1,y0,b a,x1 a,y:(r5)+
mac -y1,y0,b x:(r0 ),a y:(r4)+,y0
;compute y(n),w(n) is now in b
mac -x1,y0,b x0,x:(r0 )- b,y:(r5)-
mac x0,y0,b a,x:(r0)-
<dp n="d195"/>
asl b x;(r0)-,a b,y1
rnd b a,x:(r0)+
move y1,x:(r0)-
ENDM
<dp n="d196"/>
include