|
1 | 1 | import React from 'react'; |
2 | 2 | import styles from './styles.module.scss'; |
3 | 3 |
|
| 4 | +type FeatureItemImage = string | (() => React.ReactElement); |
| 5 | + |
4 | 6 | type FeatureItem = { |
5 | 7 | title: string; |
6 | | - Image: any; |
| 8 | + Images: FeatureItemImage | FeatureItemImage[]; |
7 | 9 | description: React.ReactNode; |
8 | 10 | }; |
9 | 11 |
|
10 | 12 | const FeatureList: FeatureItem[] = [ |
| 13 | + { |
| 14 | + title: 'Feature Rich', |
| 15 | + Images: '/img/landing/options.png', |
| 16 | + description: ( |
| 17 | + <> |
| 18 | + alphaTab provides a huge variety of features to build your music notation app: |
| 19 | + |
| 20 | + <ul> |
| 21 | + <li>Load music notation from formats like Guitar Pro 3-8, MusicXML, Capella or use the built-in text language alphaTex.</li> |
| 22 | + <li>Show standard music notation, guitar tabs, drum tabs, numbered notation (jiǎnpǔ) and slash notation.</li> |
| 23 | + <li>Adjust the music sheet look with layouts (horizontal/vertical), zoom levels, custom paddings and coloring elements to your preference.</li> |
| 24 | + <li>Interactively play songs with the built-in synthesizer including tempo control, looping, transposing.</li> |
| 25 | + <li>Synchronize songs with real audio or video recordings.</li> |
| 26 | + <li>Show individual instruments (tracks) of the overall song, or combine multiple tracks. Control the volume, pan and transposition of all instruments live.</li> |
| 27 | + </ul> |
| 28 | + </> |
| 29 | + ), |
| 30 | + }, |
11 | 31 | { |
12 | 32 | title: 'Responsive Display', |
13 | | - Image: require('@site/static/img/undraw-responsive.svg').default, |
| 33 | + Images: [ |
| 34 | + '/img/landing/alphatab-desktop.png', |
| 35 | + '/img/landing/alphatab-tablet.png', |
| 36 | + '/img/landing/alphatab-phone.png' |
| 37 | + ], |
14 | 38 | description: ( |
15 | 39 | <> |
16 | | - Depending on the available screen resolution alphaTab can resize |
17 | | - dynamically to make the music sheet fit the available space. |
| 40 | + alphaTab adjusts to the available screen resolution. Resizing rearranges the |
| 41 | + music sheet dynamically to fit again the available space. We provide a wide variety |
| 42 | + of layout options to adjust scaling, paddings and the general arrangement used. |
| 43 | + Your app will be notified about any resizing so you can adjust as needed. This way you can serve your users always the best viewing experience. |
18 | 44 | </> |
19 | 45 | ), |
20 | 46 | }, |
21 | 47 | { |
22 | | - title: 'Designed for Cross Platform usage', |
23 | | - Image: require('@site/static/img/undraw-cross-platform.svg').default, |
| 48 | + title: 'Designed for Cross Platform and Full-Stack usage', |
| 49 | + Images: '/img/landing/platforms.png', |
24 | 50 | description: ( |
25 | 51 | <> |
26 | 52 | The core of alphaTab is designed to run with minimal external dependencies |
27 | | - and on multiple platforms. From one central code base we provide |
28 | | - alphaTab for web based apps, apps using .net and Kotlin for Android. |
| 53 | + and on multiple platforms and runtime environments. From one central code base we provide |
| 54 | + alphaTab for web based apps (JavaScript), apps using .net and Kotlin for Android. |
| 55 | + Use alphaTab in your backend and frontend using your preferred technologies to build the app you want. |
29 | 56 | </> |
30 | 57 | ), |
31 | 58 | }, |
32 | 59 | { |
33 | 60 | title: 'Audio Playback', |
34 | | - Image: require('@site/static/img/undraw-audio.svg').default, |
| 61 | + Images: () => { |
| 62 | + return ( |
| 63 | + <video src='/img/landing/audio.mp4' autoPlay={true} muted={true} loop={true} controls={false} style={{maxWidth: "100%"}} /> |
| 64 | + ) |
| 65 | + }, |
35 | 66 | description: ( |
36 | 67 | <> |
37 | 68 | The built-in audio synthesizer allows users to hear what they are |
38 | 69 | seeing. Using SoundFont2 and SoundFont3 containers as input, alphaTab can generate the |
39 | 70 | matching audio to the displayed music notation and provide a live |
40 | 71 | display cursor including interactive selection of playback position and |
41 | | - ranges. |
| 72 | + ranges. <br /> |
| 73 | + Or use real audio and video recordings and synchronize them with your music sheet. |
| 74 | + Let your users play along backing tracks, real songs or build training lessons. |
| 75 | + alphaTab can be integrated with any custom external media as you need it. |
42 | 76 | </> |
43 | 77 | ), |
44 | 78 | }, |
45 | 79 | { |
46 | | - title: 'Powerful API', |
47 | | - Image: require('@site/static/img/undraw-api.svg').default, |
| 80 | + title: 'Free as in Beer', |
| 81 | + Images: '/img/landing/opensource.png', |
48 | 82 | description: ( |
49 | 83 | <> |
50 | | - Use the alphaTab APIs to build your customized look&feel on top of |
51 | | - the main rendering component. Access the full data model of the music |
52 | | - sheet to derive UI components tailored for your needs. |
| 84 | + alphaTab is provided to you for free under the terms of the MPL-2.0 license. |
| 85 | + It is developed and continuously improved since more than 15 years (2010). |
| 86 | + Simply use it in your projects or even contribute to it making it better for everyone. |
53 | 87 | </> |
54 | 88 | ), |
55 | 89 | }, |
56 | 90 | ]; |
57 | 91 |
|
58 | | -function Feature({title, Image, description}: FeatureItem) { |
| 92 | +const FeatureImage: React.FC<{ image: FeatureItemImage }> = ({ image }) => { |
| 93 | + if (typeof image === 'string') { |
| 94 | + return <img src={image} /> |
| 95 | + } |
| 96 | + |
| 97 | + const ImageComponent = image; |
| 98 | + return ( |
| 99 | + <ImageComponent /> |
| 100 | + ) |
| 101 | +}; |
| 102 | + |
| 103 | +function Feature({ title, Images, description }: FeatureItem) { |
59 | 104 | return ( |
60 | 105 | <div className={styles.feature}> |
61 | | - <div className={styles.featureImageWrap}> |
62 | | - <Image className={styles.featureImage} /> |
63 | | - </div> |
| 106 | + <div className={styles.featureImageWrap}>{ |
| 107 | + Array.isArray(Images) |
| 108 | + ? |
| 109 | + ( |
| 110 | + <div className={`${styles.featureImageGallery} ${styles['featureImageGallery' + Images.length]}`}> |
| 111 | + {Images.map(i => <FeatureImage image={i} />)} |
| 112 | + </div> |
| 113 | + ) |
| 114 | + : <FeatureImage image={Images} /> |
| 115 | + }</div> |
64 | 116 | <div className={styles.featureDescription}> |
65 | 117 | <h3>{title}</h3> |
66 | 118 | <p>{description}</p> |
|
0 commit comments