From b673fc2b13b2cd17aabf9e70f74baaa4ba3380dc Mon Sep 17 00:00:00 2001 From: Flatlogic Bot Date: Mon, 2 Feb 2026 03:05:18 +0000 Subject: [PATCH] guitar legends fx --- core/__pycache__/admin.cpython-311.pyc | Bin 212 -> 2247 bytes core/__pycache__/models.cpython-311.pyc | Bin 209 -> 5247 bytes core/__pycache__/urls.cpython-311.pyc | Bin 347 -> 758 bytes core/__pycache__/views.cpython-311.pyc | Bin 1364 -> 2971 bytes core/admin.py | 26 +- core/migrations/0001_initial.py | 59 ++++ ...ttings_effectmodule_icon_class_and_more.py | 35 +++ .../__pycache__/0001_initial.cpython-311.pyc | Bin 0 -> 3285 bytes ...module_icon_class_and_more.cpython-311.pyc | Bin 0 -> 2261 bytes core/models.py | 67 +++- core/templates/base.html | 83 +++-- core/templates/core/artist_detail.html | 92 ++++++ core/templates/core/index.html | 294 +++++++++--------- core/templates/core/preset_detail.html | 146 +++++++++ core/templates/core/settings.html | 89 ++++++ core/templates/core/standalone.html | 45 +++ core/urls.py | 11 +- core/views.py | 59 ++-- seed_presets.py | 66 ++++ static/css/custom.css | 146 ++++++++- staticfiles/css/custom.css | 149 ++++++++- 21 files changed, 1164 insertions(+), 203 deletions(-) create mode 100644 core/migrations/0001_initial.py create mode 100644 core/migrations/0002_audioenginesettings_effectmodule_icon_class_and_more.py create mode 100644 core/migrations/__pycache__/0001_initial.cpython-311.pyc create mode 100644 core/migrations/__pycache__/0002_audioenginesettings_effectmodule_icon_class_and_more.cpython-311.pyc create mode 100644 core/templates/core/artist_detail.html create mode 100644 core/templates/core/preset_detail.html create mode 100644 core/templates/core/settings.html create mode 100644 core/templates/core/standalone.html create mode 100644 seed_presets.py diff --git a/core/__pycache__/admin.cpython-311.pyc b/core/__pycache__/admin.cpython-311.pyc index a5ed392d6714413db63120e4233d2e96cbadb5de..c080906ccb90d0951b2618a1bac0fd0554104e2c 100644 GIT binary patch literal 2247 zcma)7zi-<{6u#px$<{B|PHNY#Z6&dj5J99a9av*?xZj!DfLLU zaVHHy=WH?14xL;S{%2%BgK$%TPTmyQQ>MO0TCzo}fbYmpF-i$ob!qH~ z$PFV|Y_wXu8GYYjvB#zHgWw^LWM$872afmc3&#!iBHootJ27)RjiBuYe2+(w8??jb zB*5@6PS4rL@bZ>$Vo^pcg{zjvsHHOnmZHkr8Q$*#4+u{&_q(Pc^R^v0KDTW-Z`*#d zBzP{`_Rq27r51rzBXuxxPwM=kgMVz za4AUFK(;OmX|Q)N0j44~lp^&oI)IRCp%=GJDwcs{*VIJ`enlCf0w9YXWXWc3*!7$P zxzrWB+v&!h6LDs@T<)<@ETVI=#9R1;2}l4V6;=T*b-i2K>OC8--TCW_{_5ktwwzw+ zWSlpp?|)L7>H}>mXw&3JR}1JuVIoH6o3P4uM;w5<4Isa+PGIC@A(7Z}y@-pfn00Uv z2pE=3lHM&n05OZ3y{Fhy5$HN4Vv?jSuw;{jBA5n=(z(&5R*vZ)$&iI~7o=iTsYh;v zd&5b0Ou-H97I&gpaAqpv9`Fhz7oPxt)VuJrYvwbFOr(lU^jkx~>XSJ)ssC#!yn`MH znA-3Wz||Cfj;bH^o?;%q?61}!iNnfPzr5Xhf;|lc&YlXyB%8>Y4MegzS7z+-aSRGf zxW8~=M+aRl3!&q8J#GuguPp4xaDoUsbbsT!rZ!VHe)39%KEPK5j97@3dsW^yy=T}{ zfArcl7i5{ebb@xL*6ak4aQB4@844FEs1@y!s%6i$bXfdNMDQ3fE&XZ{sA~rDWyYF?N47r@?-yI z*GN-nc|@+mVPo)V{XH7aFRgi^Ec9-_-gsl2(B%PL9w`c~;p{BD*&Zz3#o0BSU3;$* zWo6<&VJV)_^#NT+mMXGj;ZPr}JVcf%vQ&{}W8yzynXE;l_ebP9T&x8Q=V-lL3%V9B m6!jPGozSfT-5M#B?$8mLjfe4I6QY8~^8}G?d*-yHg#H5@rRetn delta 168 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 Ku%RM0pb7xLi8T)Z diff --git a/core/__pycache__/urls.cpython-311.pyc b/core/__pycache__/urls.cpython-311.pyc index 5a69659f6c6e0ae848e54157af197c543a09315f..a9cee6cf2add30a2b6ea6b087f9c49f1b0a4a971 100644 GIT binary patch literal 758 zcmaKpKWiH?7{(=^&hh!;B;=qJ`iE}Dr9^}-rG!9DCPTfHF79AdOE{O_Nk-DesV9#f zI&`bYPA#SR0R0dh&TtfSYo~06Y?&&>J(mR2SJI2#M?WFy(brn73QYVA#^DqK@Y@ze zcz-9Czs%$lpn$>%#IOS)pe5==rP%2>5R?Fe6fx%n6&tC0UjE_$@ZF4MTr(SnaSMf3 z)-s-9$}6V2mhlaV=9 zENBw3L%C}p>~Ga P3%|Tw8vC}%9dqG7yCTNk delta 244 zcmeyydYegoIWI340}xbw%g@XL(vLwL7+{4mKHE%GS4~b~UBkAFnSo(75JNyZV-!mY zdoY70$4iiaCgUxZg2a-HmyA$OMt*MUErueHF(A3T#N1RrP1al7DOrhm>G^u4MLESq zAj594mSv`v7Z--=S zaY!XvMQRR}(gT$^R5TG$lvBl_hn#w?ZLNg05~r#MZdCM?Q{S6qH(*H9s_F=y=goWj zX7+vazPCR{BCP_9Upp4{^?)G!hKe_&-O0{Xm^>1QKtw|*h*_~9Wu=0gl|_L_L^hN{ zAR8#CS+$^LwL&l(gmvY-eHBL?W|nSRj(U|*lUh!AWNHe`S4yO8P^V+KO!U%7 zaau3Z32Iq-aoU{3C%vJ;M27#JpFlhkEN>ltXMMjF@4fd}1$g(T(kl3@`F@ZO`Ag|7 z-)lj%RA1Q}PkFWaYPJf~HD6tjtdOq=706#jtVkrVEUm(M*YM1IK;G2xYiZF5>1J+< z=B+YhXbZQUk4=^s&FGNIJLhJsf{~V-HqRqB$J1pxTAt_6Osgyi4>_8fZ_`nybi<;I zVTK$zZx{^s1ave;zbI4FVo}gp41|f6R4VoIY-XlZpqcWGa?vVh=p8y)wn{8>yTopq zbNNY{;U~JK)7$2`xw}q)pN$=br!gbu=O7k^&G_5j-rI=x*5keFoz-}6Ek0z&ht}B( zah=)mkE%-NX0-D`aU+_lM^m+Ew;k_s~QmhjuPGsLMtP9q{=rs-kaEYA!{?_A*)kt40(q~8d7C&yh7KihV z_JoVWAmT9Ci~~CcArHsl8Cd>b99HnH4-C>&%nNc;0m>XLRVQFtbPkJ-1BR8yQYa8GCu&jyIge2zZ&7j(z@+Ej4B);!SvR;Lu;z6ThXNRG zfAGmhxT_xSs)bM5;gcKTv-R-V$1}C?pdB7u9N8@^4(E|$P*#5j=bq9Lkbv;s?feX@ z|CLv-LzyjzP;kPmUuHzU$%~II!>SMH3UsW4gDCrXx+3QAe0*3)V7ucVL<$gfKMfp+ zj9BvVFC%Lt_=d zXP7MLFw)#jN4fgx#5E^Gn0|}0oOO4OI-wh7Xt^wB>hpAK5nP>+nJ>&4G{@lf>KC8l zjm~2q&Ow9bEqK12lbWY;K68SenvO7hJ=TV?BK#YGQHVP$1t(g*G@1RWv8#~2k zdeLI1@u4)TikXMw;a%8mS}ysWL7V1AB3{$t)W_aKUld4s<}V)dP7W;v?O@kt zvU_FlhYK4$1NEMP=T}|~)Otqkp3z!z%ubFS>hVFX=aSuXsg}HKCogl4MzHOh$k&mt zVh>_VvCUY#ns~PsOWUz@HJJY0ZF`wUu>IlKwk-7n(Ms6xKx_+AKy!(9Z)IYw@XADX z*iW=@3!0i7d|gQ6^PMhQR=!B`MyW{M{v*1%6?tw=++w$lbeO(pj+AZ}jZ&Vl0k9)B zCbl8St$XmkTBzR+^;eaCe$erB)M+EL`QmixoHfZ15mC;v)G*yH$C(og z!@V;2DZ%>|=ROxz-1&*X<8!QE1~0fgJ;VmVga6 literal 1364 zcmZ`(&1)M+6ra_{dS%J>I&SM!uH%hUh$T{~CE!96oTjQ1oHkCdQ$lozPf-Q6#oM~=1-7}AYwoe=&3h>36z}rW~~)fO5P4{-h1=r&HMPV zzfVm~BA|nRhVUX&zZ=1NEJDd#(kRMro?7~GlVKiARAFbK7y={g8`rq_)Wa;XDEltUWCmB zkq~sth&3ZeP{;A878u54V{Oaty2i>_vx<&kIwj51DaMXgGg(=)ND+pj!HI^Q9g`Br z#tzdA%!;PvWg3a1>()Z2BR!#4DWHiJ1dw>FOuS)~xge&2p-9tZ06jh%7)=`o)~k%rY>m)oo?Fy$ z*3WOp#5FJD)_FvD(?z&0py>SutcBjF^RHFyMAbU#a#vk`t*)G?D;+i6Rnx7Fo|by~ z_(Z$b)~@ZR_tUQyT0itB&pp5LYvy^Tl^e+D)6aYJ%l+g^CzEdC%omzVp>MZ5DOS%5y(&3}_3#G)vBoY=0%a*_@+2?}vn5F`+w z7NBbBQXhKgF}Lc_Lna4hGUh>t9P}sjxSYX3v!~4T-&Nxm}ka*mE zc)Ra=-+Oq=Z~OXE5?r}||HaZ_^e;Z?U9s-qX$1yHTdK6vbNV4y=C!cX%x;C@w6M zJq=2P;l@(ZvwG3JjmWkz3t zzVI68M~))V@YC1J6pFUa9FGf)3Y-3(4L-5jt6FI_-qWt;4o3sM5ju;s)|*G) zkY(kSS$^v^cseJrojmk-{w4Uwj&UiYw}H=hj^je_{^B@`t??Hs<~P51w+VFNC9K6z z37s=#OKwdbMQ%o`gJ=r6&U-9*yVq^*Gj)#mmgh6YLf4scvr>$*jM4O6y+*L%W5m)8 zV$}_@sjuNpmh>>O4BOhmEVF^hlIvmJG3uB_xqSQ|Ah;+)H!~jSHg-&Zg+)EPX@X8| zI@WpsS(YHnH9$HuS*Ql5IF^uv62vS z>N`}l!Rc(D}~!t0Nz%NDkg$1)4c%edy>c2U#DEK!4iOqXmH zqugBsBLf`WX1*-|y)Qlw-pEs5)2m3IO5~H@ZmA(g33pajzF@zDX zt+-YVdm#v!3<(f-3HGqhV!q{r_q65d%Rp(9U<7=`5neW$w$D@}OhCLL%)PC2%_X=L zYKsw;bR8Ye1MCCk1lv3(A?1qivJ;Dz=@|C>ieWj6K5np>OAsc6_f(bz@4n@jp6)g4 zJcV0Bg3cRYJgfZ{s5CrpR(rn~5r9b^7KsSN5d@5F@O{hJshos^OR}Q_vDih&1rJjnB_5&d*gA*x+5)1ArU&rURvg zyY5nM19wmJ@1&=IO#1P|$rZPbC!0%6$8S#J2e<|}$>g71vgS368lL1#Pd@t>FgZ0f z^`731zSP(x{B#$Bw^HvuF!1p3^F#l@!yBEbJg7dr)k#RnvwuqkiP8OB{)gNU9UlK` zBN!gvi~jRGt?JYvbl7VTd%>_rv;KZ=nC6Syr-FQOcai3=wDVVj{1uv=eg459&0lWk zF9-R{G&{4O8>QOR*J_|mwY7_Zc9CW;?dMK!yW7kEaCa+vJ{_&JM=QZ-g=QD_b8pbX z`1adDVVq9ip`U+A3wpbt2L+vG|J3P=5B7IrsbuPj1mb{;&Z%eU&;BpyN9dUg+n)w! zE_5Vm=8keqey)7MRij@jPlP-W5;Qqoc`m?RpK4dz+SNe2O0&Q3Bx4+Jg5w2oz(r@^ z8Q!16_8}d+HCmW$7iNRPEY1GzHQ9y?T;dtHw6{RDa$740TA60&A>njnV*7G1GO@ey z{bn$8Bbd1x%>0p>4G3*Rp64;2uJD*aLd+m}%nQn^Qt{T$NCkv8%`-i{XVAj6cHvr3 zxJI*c`?+&;Z2Id@gR$wo3cXdM4Udlb?J++X^J%vElbF9~(2@1_$a*lcPP61E%}fU( z@Z~uXT3Liv7NM0zXb^H*g{) zSy5&A@ZB$=r4qC!_)A{uH2_ipGnPDjE*g^PLE(G)5#L2@bqhv6Ca#9qBNejRG(!2C!-;VmetahXq#aF2yd;ST3aPX3+0>gg+#(Gx{ literal 0 HcmV?d00001 diff --git a/core/migrations/__pycache__/0002_audioenginesettings_effectmodule_icon_class_and_more.cpython-311.pyc b/core/migrations/__pycache__/0002_audioenginesettings_effectmodule_icon_class_and_more.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d55a3d28fc9276a8c9e42b749bed067f9c121dfb GIT binary patch literal 2261 zcmZt{OK{UhRFWP46Kp47ASB2xAu-e95PIlPri~r*am%Me3bclfDr-0P23c}fQougt z&_j>hdd>8Zwo@N_;MN{{lxH*@k4~NGDK|6Z#HD?^jzbbySx@i(-oE#C{qy*EOn~*r zR4FO5t3n+la^}xtz8?fK@scHZP zSB3o84io1kKh`95s@lXfEI-sV5!NkjWXZncd&H~1MHUhZRS^kQ35j*F8ju7WTpuL` zp%LSR*25zQCqbYqXrg;; z8?yNg-r)kBkk)jhr~fhTzPJ)JnBm3gPuNv_3P#Vk?q?RfQY_tatU zU=v)A?}ZZ3X*7K#))_Q|X1iw(SD-5&rn#5I0WaCZUZ9pasO4<;y~ELu`l$!1a-iJ)du>?al%7cVKqAU08Tf3oNxVqP=q#K5cAwuw=!F!y zvit;w)HEApj*k5p(M&_pbk(vtp&I!>YdM{%l4;tOP1TlM0jbQTJ4-B=z;GMU2G(1O zji1>(EvQF~A8TH6nq!%c@o;`bgPqn*+Rld|lL%@aNg_VX$9jkC%SB*Mof@%Wp z9JQ@b%x0sLC^M>Xk5eEGJ2ugY-R@-W4-t8xa! zxco$k)Qd3W*IBRp=t@JSLo`t_ppJM%L5Fm#8bev6h|my=6?J>06EjXd z*LtC0HgUnJIfm^N@H4DIC|Y=G(kE6+)o_6w%EFt=x&X&>Nm1FUgt>-|TYINcIXFYg zn-NlA^kDxKUu?B0{ILieFvR*DF4E2YXAlyi*+D>>3T@sR#DwVCA7Wl)wx2rxPwKdv zx$u0$%UpO7{Og=sRa}F*8LOAEyo}{0?S5+3l^3@{p1e2^gexWK2)rfTV=P5d*(Y0* zUUIn0A#hTf#9drwE-t@VapmQnyzI%#ZnAh#aLtuVJ-Ot`B{#X!Pn~tMm$puL*-I}9 z?t`!0Y_*rIdfBR*eAG|LZfXDm!+{-=oa*y5QH~rL{JAY+s!<)bI z=ZEh6&EEV?Z~ms6tPGAtrX~hs@o4O&0AQDa!AT){h81GEpPB2YX8P&e^YdOh_sd7_ zr}y0&a?`k%#$Fl^!a-&SV3z?_z*%ND!|kR=cCg#`SA$33x4{}?O=>|X3_vIhz@r}L zGU?FfXY8THQ5)~T4ID-5aHhMlxjH-spU^Up>`&Bs0ALUh jMG=}W=3Qao?cX3YBZdaT+u(W3OP+hl1iSB$^0@y4zZ!Z9 literal 0 HcmV?d00001 diff --git a/core/models.py b/core/models.py index 71a8362..1e3c391 100644 --- a/core/models.py +++ b/core/models.py @@ -1,3 +1,68 @@ from django.db import models +from django.urls import reverse -# Create your models here. +class Artist(models.Model): + name = models.CharField(max_length=255) + slug = models.SlugField(unique=True) + description = models.TextField() + image_url = models.URLField(blank=True, null=True) + style = models.CharField(max_length=100, help_text="e.g. Rock, Metal, Blues") + + def __str__(self): + return self.name + +class EffectModule(models.Model): + CATEGORY_CHOICES = [ + ('dynamics', 'Dynamics (Gate/Comp)'), + ('drive', 'Drive/Overdrive'), + ('amp', 'Amplifier'), + ('modulation', 'Modulation (Chorus/Flanger)'), + ('delay_reverb', 'Delay/Reverb'), + ('utility', 'Utility (IR Loader/Wah)'), + ('cab', 'Cabinet'), + ] + name = models.CharField(max_length=255) + category = models.CharField(max_length=50, choices=CATEGORY_CHOICES) + description = models.TextField(blank=True) + icon_class = models.CharField(max_length=50, default='bi-cpu', help_text="Bootstrap Icon class") + + def __str__(self): + return self.name + +class Preset(models.Model): + artist = models.ForeignKey(Artist, on_delete=models.CASCADE, related_name='presets') + title = models.CharField(max_length=255) + slug = models.SlugField(unique=True) + description = models.TextField() + is_featured = models.BooleanField(default=False) + + def __str__(self): + return f"{self.artist.name} - {self.title}" + +class SignalChainStep(models.Model): + preset = models.ForeignKey(Preset, on_delete=models.CASCADE, related_name='steps') + module = models.ForeignKey(EffectModule, on_delete=models.CASCADE) + order = models.PositiveIntegerField(default=0) + settings_summary = models.CharField(max_length=255, blank=True, help_text="e.g. Gain: 8, Bass: 4") + + class Meta: + ordering = ['order'] + + def __str__(self): + return f"{self.preset.title} - {self.module.name} (Step {self.order})" + +class AudioEngineSettings(models.Model): + DRIVER_CHOICES = [ + ('asio', 'ASIO'), + ('wasapi', 'WASAPI'), + ('directsound', 'DirectSound'), + ] + driver_type = models.CharField(max_length=20, choices=DRIVER_CHOICES, default='asio') + buffer_size = models.IntegerField(default=128) + sample_rate = models.IntegerField(default=44100) + input_device = models.CharField(max_length=255, default='Default Input') + output_device = models.CharField(max_length=255, default='Default Output') + is_standalone_mode = models.BooleanField(default=True) + + def __str__(self): + return f"Settings ({self.driver_type})" \ No newline at end of file diff --git a/core/templates/base.html b/core/templates/base.html index 1e7e5fb..9fbd72e 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -1,25 +1,70 @@ - - - {% block title %}Knowledge Base{% endblock %} - {% if project_description %} - - - - {% endif %} - {% if project_image_url %} - - - {% endif %} - {% load static %} - - {% block head %}{% endblock %} + + + {% block title %}Master of Tones - 64-bit Multi-Effects{% endblock %} + {% if project_description %} + + {% endif %} + {% load static %} + + + + + + + + + + {% block head %}{% endblock %} + + - - {% block content %}{% endblock %} +
+ {% block content %}{% endblock %} +
+ +
+
+
+ +
+

© 2026 MASTER OF TONES ENGINE. ALL RIGHTS RESERVED.

+

ENGINEERED FOR HIGH-FIDELITY PERFORMANCE & LOW LATENCY.

+
+
+ + + - - + \ No newline at end of file diff --git a/core/templates/core/artist_detail.html b/core/templates/core/artist_detail.html new file mode 100644 index 0000000..5ab9cf2 --- /dev/null +++ b/core/templates/core/artist_detail.html @@ -0,0 +1,92 @@ +{% extends 'base.html' %} +{% load static %} + +{% block content %} +
+
+
+
+
+ {% if artist.image_url %} + {{ artist.name }} + {% else %} +
+ +
+ {% endif %} +
+
+
+ FEATURED ARTIST +

{{ artist.name }}

+

{{ artist.style }} Master

+

{{ artist.description }}

+
+
+
+
+ +
+
+
+

SIGNATURE BANK

+

Choose a preset to explore the 64-bit signal chain.

+
+
+ BANK_ID: {{ artist.id|add:100 }} +
+
+ +
+ {% for preset in presets %} +
+
+
+
+

{{ preset.title }}

+ +
+

{{ preset.description|truncatewords:25 }}

+ +
+
+ {% for step in preset.steps.all|slice:":3" %} + {{ step.module.name }} + {% endfor %} + {% if preset.steps.count > 3 %} + +{{ preset.steps.count|add:"-3" }} + {% endif %} +
+
+ + VIEW CHAIN +
+ +
+
+ {% empty %} +
+
+

No presets found for this artist.

+
+
+ {% endfor %} +
+
+ + +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/index.html b/core/templates/core/index.html index faec813..e96b930 100644 --- a/core/templates/core/index.html +++ b/core/templates/core/index.html @@ -1,145 +1,157 @@ -{% extends "base.html" %} - -{% block title %}{{ project_name }}{% endblock %} - -{% block head %} - - - - -{% endblock %} +{% extends 'base.html' %} +{% load static %} {% block content %} -
-
-

Analyzing your requirements and generating your app…

-
- Loading… +
+ +
+ +
+
+
+ NEW ENGINE v2.0 +

LEGENDARY TONES

+

+ The most powerful multi-effects suite for guitarists. 70+ Signature presets from 14 icons. + Optimized for ASIO/WASAPI with a native 64-bit architecture. +

+ +
+
+
+
+
+
+
+
+
+ MASTER_ENGINE_X64 +
+
+
+ LATENCY + 2.9ms +
+
+
+
+
+
+
+ DSP LOAD + 0.03% +
+
+
+
+
+
+
+
-

AppWizzy AI is collecting your requirements and applying the first changes.

-

This page will refresh automatically as the plan is implemented.

-

- Runtime: Django {{ django_version }} · Python {{ python_version }} - — UTC {{ current_time|date:"Y-m-d H:i:s" }} -

-
-
-
- Page updated: {{ current_time|date:"Y-m-d H:i:s" }} (UTC) -
+ + +
+
+
+
+

THE ROSTER

+

Explore the signature chains of guitar legends.

+
+
+ 14 +

Icons

+
+
+ + +
+
+ +
+
+
+
+

64-BIT ACCELERATION

+

+ Our proprietary engine leverages native 64-bit processing for maximum dynamic range and zero audible distortion. + Whether you use ASIO on Windows or Core Audio on macOS, + the latency remains imperceptible. +

+
+
+
+
+
+ +
Ultra Low Latency
+

Sub 3ms processing with WASAPI/ASIO.

+
+
+
+
+ +
Dual IR Loader
+

Blend two impulses for massive space.

+
+
+
+
+ +
Noise Gate
+

Advanced algorithms for dead silence.

+
+
+
+
+ +
64-Bit Core
+

Optimized for high-performance DSP.

+
+
+
+
+
+
+
+ + {% endblock %} \ No newline at end of file diff --git a/core/templates/core/preset_detail.html b/core/templates/core/preset_detail.html new file mode 100644 index 0000000..6187002 --- /dev/null +++ b/core/templates/core/preset_detail.html @@ -0,0 +1,146 @@ +{% extends 'base.html' %} +{% load static %} + +{% block content %} +
+
+
+
+ +

{{ preset.title }}

+

{{ preset.description }}

+
+ Artist: {{ preset.artist.name }} + Style: {{ preset.artist.style }} + 64-bit Ready +
+
+
+ +
+
+
+
+ +
+

Signal Chain Architecture

+ +
+
+
+
+ Input +
+ +
+ + {% for step in steps %} +
+
+
+ #{{ forloop.counter }} + +
+
+
+ +
+
{{ step.module.name }}
+ {{ step.module.get_category_display }} +
+ +
+
+ + {% if not forloop.last %} +
+ {% endif %} + {% endfor %} + +
+ +
+
+ Output +
+
+
+ +
+
+
+
+
Module Technical Specs
+
+
+
    + {% for step in steps %} +
  • +
    + {{ step.module.name }} + {{ step.module.get_category_display }} +
    + {{ step.settings_summary }} +
  • + {% endfor %} +
+
+
+
+
+
+
+
Engine Performance
+
+
+
+
0.03%
+ CPU Usage (64-bit Core) +
+
+
+
2.9 ms
+ Latency (ASIO) +
+
+
48 kHz
+ Sample Rate +
+
+
+
+
+
+
+ + +{% endblock %} \ No newline at end of file diff --git a/core/templates/core/settings.html b/core/templates/core/settings.html new file mode 100644 index 0000000..3046a7f --- /dev/null +++ b/core/templates/core/settings.html @@ -0,0 +1,89 @@ +{% extends 'base.html' %} +{% load static %} + +{% block content %} +
+
+
+
+
+

Audio Engine Settings

+ 64-BIT STANDALONE MODE +
+
+
+ {% csrf_token %} +
+
+ + +
ASIO is recommended for professional audio interfaces.
+
+
+ + +
+
+ +
+
+ + +
+
+ +
+ Estimated: 2.9 ms +
+
+
+ +
+ +
+ + +
+
+
+
+ +
+

+ These settings apply to the local audio engine proxy. Ensure your audio interface is connected. +

+
+
+
+
+ + +{% endblock %} diff --git a/core/templates/core/standalone.html b/core/templates/core/standalone.html new file mode 100644 index 0000000..4a9d856 --- /dev/null +++ b/core/templates/core/standalone.html @@ -0,0 +1,45 @@ +{% extends 'base.html' %} +{% load static %} + +{% block content %} +
+
+
+

Master of Tones v2.0

+

+ Experience the ultimate multi-effects suite as a standalone 64-bit application. + Full ASIO/WASAPI support, zero-latency monitoring, and dual-IR loader integration. +

+ +
+
+
+ +

Windows 64-bit

+

Standalone & VST3 Included

+ +
+
+
+
+ +

macOS (Silicon/Intel)

+

Standalone & AU/VST3

+ +
+
+
+ +
+
Minimum Requirements
+
    +
  • Windows 10/11 64-bit or macOS 11+
  • +
  • Intel Core i5 / Apple M1 or better
  • +
  • 8GB RAM
  • +
  • ASIO compatible audio interface (recommended)
  • +
+
+
+
+
+{% endblock %} diff --git a/core/urls.py b/core/urls.py index 6299e3d..56295fb 100644 --- a/core/urls.py +++ b/core/urls.py @@ -1,7 +1,10 @@ from django.urls import path - -from .views import home +from . import views urlpatterns = [ - path("", home, name="home"), -] + path('', views.index, name='index'), + path('artist//', views.artist_detail, name='artist_detail'), + path('preset//', views.preset_detail, name='preset_detail'), + path('settings/', views.audio_settings, name='audio_settings'), + path('standalone/', views.standalone_download, name='standalone_download'), +] \ No newline at end of file diff --git a/core/views.py b/core/views.py index c9aed12..9fdb61d 100644 --- a/core/views.py +++ b/core/views.py @@ -1,25 +1,42 @@ -import os -import platform +from django.shortcuts import render, get_object_or_404, redirect +from .models import Artist, Preset, EffectModule, AudioEngineSettings -from django import get_version as django_version -from django.shortcuts import render -from django.utils import timezone +def index(request): + featured_presets = Preset.objects.filter(is_featured=True)[:6] + artists = Artist.objects.all() + return render(request, 'core/index.html', { + 'featured_presets': featured_presets, + 'artists': artists + }) +def artist_detail(request, slug): + artist = get_object_or_404(Artist, slug=slug) + presets = artist.presets.all() + return render(request, 'core/artist_detail.html', { + 'artist': artist, + 'presets': presets + }) -def home(request): - """Render the landing screen with loader and environment details.""" - host_name = request.get_host().lower() - agent_brand = "AppWizzy" if host_name == "appwizzy.com" else "Flatlogic" - now = timezone.now() +def preset_detail(request, slug): + preset = get_object_or_404(Preset, slug=slug) + steps = preset.steps.all().select_related('module') + return render(request, 'core/preset_detail.html', { + 'preset': preset, + 'steps': steps + }) - context = { - "project_name": "New Style", - "agent_brand": agent_brand, - "django_version": django_version(), - "python_version": platform.python_version(), - "current_time": now, - "host_name": host_name, - "project_description": os.getenv("PROJECT_DESCRIPTION", ""), - "project_image_url": os.getenv("PROJECT_IMAGE_URL", ""), - } - return render(request, "core/index.html", context) +def audio_settings(request): + settings, created = AudioEngineSettings.objects.get_or_create(pk=1) + if request.method == 'POST': + settings.driver_type = request.POST.get('driver_type') + settings.buffer_size = int(request.POST.get('buffer_size', 128)) + settings.sample_rate = int(request.POST.get('sample_rate', 44100)) + settings.save() + return redirect('audio_settings') + + return render(request, 'core/settings.html', { + 'settings': settings + }) + +def standalone_download(request): + return render(request, 'core/standalone.html') \ No newline at end of file diff --git a/seed_presets.py b/seed_presets.py new file mode 100644 index 0000000..8fa3d53 --- /dev/null +++ b/seed_presets.py @@ -0,0 +1,66 @@ +from core.models import Artist, EffectModule, Preset, SignalChainStep +from django.utils.text import slugify + +# 1. Create Effect Modules +modules_data = [ + ('Noise Gate', 'dynamics', 'bi-shield-shaded'), + ('Compressor', 'dynamics', 'bi-input-cursor'), + ('Overdrive TS-808', 'drive', 'bi-lightning-charge'), + ('High Gain Amp', 'amp', 'bi-speaker'), + ('Clean Tube Amp', 'amp', 'bi-speaker'), + ('Dual IR Loader', 'utility', 'bi-file-earmark-music'), + ('Stereo Chorus', 'modulation', 'bi-water'), + ('Classic Flanger', 'modulation', 'bi-wind'), + ('Analog Delay', 'delay_reverb', 'bi-hourglass-split'), + ('Wah Wah Pedal', 'utility', 'bi-reception-4'), +] + +created_modules = {} +for name, cat, icon in modules_data: + mod, _ = EffectModule.objects.get_or_create( + name=name, + defaults={'category': cat, 'icon_class': icon} + ) + created_modules[name] = mod + +# 2. Get Artists +artists = Artist.objects.all() + +# 3. Create 5 Presets per Artist +for artist in artists: + for i in range(1, 6): + title = f"{artist.name} Signature {i}" + slug = slugify(f"{artist.name}-{i}-{title}") + + preset, created = Preset.objects.get_or_create( + artist=artist, + slug=slug, + defaults={ + 'title': title, + 'description': f"A signature tone for {artist.name}, optimized for {artist.style} style." + } + ) + + if created: + # Build a typical signal chain + # Order: Gate -> Comp -> Wah -> Drive -> Amp -> IR -> Mod -> Delay + steps = [ + ('Noise Gate', 'Threshold: -40dB'), + ('Compressor', 'Ratio: 4:1'), + ('Wah Wah Pedal', 'Auto-sweep'), + ('Overdrive TS-808', 'Drive: 4, Tone: 6'), + ('High Gain Amp', 'Gain: 7, Bass: 5, Mid: 6, Treble: 7'), + ('Dual IR Loader', 'Cab A: 4x12 SM57, Cab B: 4x12 R121'), + ('Stereo Chorus', 'Rate: 0.5Hz, Depth: 40%'), + ('Analog Delay', 'Time: 450ms, Feedback: 30%'), + ] + + for idx, (mod_name, settings) in enumerate(steps): + SignalChainStep.objects.create( + preset=preset, + module=created_modules[mod_name], + order=idx, + settings_summary=settings + ) + +print("Successfully seeded 5 presets per artist.") diff --git a/static/css/custom.css b/static/css/custom.css index 925f6ed..4eea7b3 100644 --- a/static/css/custom.css +++ b/static/css/custom.css @@ -1,4 +1,144 @@ -/* Custom styles for the application */ -body { - font-family: system-ui, -apple-system, sans-serif; +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=Oswald:wght@500;700&display=swap'); + +:root { + --bg-dark: #0A0A0B; + --card-bg: #161618; + --accent-gold: #FFD700; + --accent-cyan: #00E5FF; + --text-main: #E1E1E1; + --text-muted: #A0A0A0; + --border-color: #2D2D30; } + +body { + background-color: var(--bg-dark); + color: var(--text-main); + font-family: 'Inter', sans-serif; + line-height: 1.6; +} + +h1, h2, h3, h4, .brand-font { + font-family: 'Oswald', sans-serif; + text-transform: uppercase; + letter-spacing: 1px; +} + +/* Navbar */ +.navbar { + background-color: rgba(10, 10, 11, 0.95); + backdrop-filter: blur(10px); + border-bottom: 1px solid var(--border-color); +} + +.navbar-brand { + font-family: 'Oswald', sans-serif; + color: var(--accent-gold) !important; + font-weight: 700; + font-size: 1.5rem; +} + +/* Hero Section */ +.hero-section { + padding: 100px 0; + background: radial-gradient(circle at center, #1a1a1c 0%, #0A0A0B 100%); + position: relative; + overflow: hidden; +} + +.hero-section::before { + content: ''; + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: radial-gradient(circle, rgba(255, 215, 0, 0.03) 0%, transparent 50%); + pointer-events: none; +} + +.hero-title { + font-size: 4rem; + font-weight: 700; + color: #fff; + margin-bottom: 1rem; +} + +.hero-accent { + color: var(--accent-gold); +} + +/* Cards */ +.card-tone { + background-color: var(--card-bg); + border: 1px solid var(--border-color); + border-radius: 12px; + transition: all 0.3s ease; + overflow: hidden; +} + +.card-tone:hover { + transform: translateY(-5px); + border-color: var(--accent-gold); + box-shadow: 0 10px 30px rgba(0,0,0,0.5); +} + +.card-tone .card-body { + padding: 1.5rem; +} + +.card-tone .artist-name { + color: var(--accent-gold); + margin-bottom: 0.5rem; +} + +/* Signal Chain Widget */ +.signal-chain { + display: flex; + align-items: center; + gap: 15px; + padding: 20px; + background: #000; + border-radius: 8px; + overflow-x: auto; +} + +.module-box { + min-width: 120px; + padding: 15px; + background: var(--card-bg); + border: 2px solid var(--border-color); + border-radius: 6px; + text-align: center; + position: relative; +} + +.module-box.active { + border-color: var(--accent-cyan); + box-shadow: 0 0 15px rgba(0, 229, 255, 0.2); +} + +.chain-arrow { + color: var(--text-muted); +} + +/* Buttons */ +.btn-primary-tone { + background-color: var(--accent-gold); + color: #000; + font-family: 'Oswald', sans-serif; + font-weight: 600; + border: none; + padding: 12px 25px; + transition: all 0.2s; +} + +.btn-primary-tone:hover { + background-color: #fff; + color: #000; + transform: scale(1.05); +} + +/* Utility */ +.text-muted { + color: var(--text-muted) !important; +} \ No newline at end of file diff --git a/staticfiles/css/custom.css b/staticfiles/css/custom.css index 108056f..4eea7b3 100644 --- a/staticfiles/css/custom.css +++ b/staticfiles/css/custom.css @@ -1,21 +1,144 @@ +@import url('https://fonts.googleapis.com/css2?family=Inter:wght@400;600&family=Oswald:wght@500;700&display=swap'); :root { - --bg-color-start: #6a11cb; - --bg-color-end: #2575fc; - --text-color: #ffffff; - --card-bg-color: rgba(255, 255, 255, 0.01); - --card-border-color: rgba(255, 255, 255, 0.1); + --bg-dark: #0A0A0B; + --card-bg: #161618; + --accent-gold: #FFD700; + --accent-cyan: #00E5FF; + --text-main: #E1E1E1; + --text-muted: #A0A0A0; + --border-color: #2D2D30; } + body { - margin: 0; + background-color: var(--bg-dark); + color: var(--text-main); font-family: 'Inter', sans-serif; - background: linear-gradient(45deg, var(--bg-color-start), var(--bg-color-end)); - color: var(--text-color); - display: flex; - justify-content: center; - align-items: center; - min-height: 100vh; - text-align: center; + line-height: 1.6; +} + +h1, h2, h3, h4, .brand-font { + font-family: 'Oswald', sans-serif; + text-transform: uppercase; + letter-spacing: 1px; +} + +/* Navbar */ +.navbar { + background-color: rgba(10, 10, 11, 0.95); + backdrop-filter: blur(10px); + border-bottom: 1px solid var(--border-color); +} + +.navbar-brand { + font-family: 'Oswald', sans-serif; + color: var(--accent-gold) !important; + font-weight: 700; + font-size: 1.5rem; +} + +/* Hero Section */ +.hero-section { + padding: 100px 0; + background: radial-gradient(circle at center, #1a1a1c 0%, #0A0A0B 100%); + position: relative; overflow: hidden; +} + +.hero-section::before { + content: ''; + position: absolute; + top: -50%; + left: -50%; + width: 200%; + height: 200%; + background: radial-gradient(circle, rgba(255, 215, 0, 0.03) 0%, transparent 50%); + pointer-events: none; +} + +.hero-title { + font-size: 4rem; + font-weight: 700; + color: #fff; + margin-bottom: 1rem; +} + +.hero-accent { + color: var(--accent-gold); +} + +/* Cards */ +.card-tone { + background-color: var(--card-bg); + border: 1px solid var(--border-color); + border-radius: 12px; + transition: all 0.3s ease; + overflow: hidden; +} + +.card-tone:hover { + transform: translateY(-5px); + border-color: var(--accent-gold); + box-shadow: 0 10px 30px rgba(0,0,0,0.5); +} + +.card-tone .card-body { + padding: 1.5rem; +} + +.card-tone .artist-name { + color: var(--accent-gold); + margin-bottom: 0.5rem; +} + +/* Signal Chain Widget */ +.signal-chain { + display: flex; + align-items: center; + gap: 15px; + padding: 20px; + background: #000; + border-radius: 8px; + overflow-x: auto; +} + +.module-box { + min-width: 120px; + padding: 15px; + background: var(--card-bg); + border: 2px solid var(--border-color); + border-radius: 6px; + text-align: center; position: relative; } + +.module-box.active { + border-color: var(--accent-cyan); + box-shadow: 0 0 15px rgba(0, 229, 255, 0.2); +} + +.chain-arrow { + color: var(--text-muted); +} + +/* Buttons */ +.btn-primary-tone { + background-color: var(--accent-gold); + color: #000; + font-family: 'Oswald', sans-serif; + font-weight: 600; + border: none; + padding: 12px 25px; + transition: all 0.2s; +} + +.btn-primary-tone:hover { + background-color: #fff; + color: #000; + transform: scale(1.05); +} + +/* Utility */ +.text-muted { + color: var(--text-muted) !important; +} \ No newline at end of file